0

我有项目表,每个项目都有它的开始时间和结束时间。

例如:

| id      | item | start      | end        |
+---------+------+------------+------------+
|    2703 | 223  | 2003-12-30 | 2004-01-16 |
|   47029 | 223  | 2004-04-21 | 2005-01-06 |
| 1386593 | 223  | 2005-04-19 | 2005-04-19 |
| 1386739 | 223  | 2005-04-19 | 2006-12-07 |
| 1432862 | 223  | 2006-02-08 | 2006-02-10 |

我想找到项目之间的差距(一个人结束与下一次开始之间的天数)。示例中前两项之间的间隔为 93 天,后两项之间有重叠 302 天,计为零。因此,例如表格的差距是:

96
103
0
0

我的目标是找到平均间隔(本例中为 49.75)或间隔天数的总和(199)。

可选目标:最小差距 (0) 和最大差距 (103)。

我现在的解决方案是遍历行并在数据库外部计算它,但我正在寻找快速解决方案(在 MySQL 内部)。我查看了聚合函数,但不知道这是否可能。找到这种平均差距的最佳方法是什么?

4

6 回答 6

4
select avg(if (diff < 0, 0, diff))
from (
    select datediff(min(t2.start), t1.end) as diff
    from Table1 t1
    inner join Table1 t2 on t1.id < t2.id
    group by t1.end
) a

SQL 小提琴示例

于 2012-10-23T15:59:00.850 回答
1

SELECT DATEDIFF(start,end) AS average_gap FROM table

@seeDATEDIFF()来自 MySQL 文档。

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff

返回天数。该方法是减法,因此您需要在 SQL 之外处理负数。否则,你可以做AVG(DATEDIFF(start, end))

编辑:

你可以做

AVG(GREATEST(DATEDIFF(start,end), 0))
于 2012-10-23T15:52:12.227 回答
0

DATEDIFFAVG的组合怎么样?

这样你会做 SELECT AVG(DATEDIFF(start,end)) AS gap

编辑:该死,打一拳!:P

于 2012-10-23T15:54:42.427 回答
0

这不是您将能够仅在 SQL 查询中完成的事情,您将不得不将数据带入您的应用程序并确定这些间隔中的间隙和重叠。

这不会是一段微不足道的代码,但写起来应该很有趣。我建议遍历列表并将所有相交间隔相加,直到剩下一个或多个非相交间隔,您可以使用这些间隔计算间隙。

于 2012-10-23T16:11:29.673 回答
0
select avg(diff) FROM 
( select @rt:=NULL, 
         @rt := if(datediff(start, @end)<0,0,datediff(start, @end)) diff, 
         @end := end from t) t;
于 2012-10-23T16:14:56.150 回答
0

这(在某些情况下)可以仅使用 SQL 来解决。我会使用这个 VIEW 来查找所有的间隔:

CREATE VIEW items_intervals AS
SELECT
  items.end,
  min(items_1.start) as start
FROM
  items inner join items items_1 on items_1.id > items.id
GROUP BY
  items.end

现在您所要做的就是聚合数据:

SELECT
  min(greatest(0,datediff(start,end))),
  max(greatest(0,datediff(start,end))),
  sum(greatest(0,datediff(start,end))),
  avg(greatest(0,datediff(start,end)))
FROM
  items_intervals

当然,您可以将两个查询组合在一起,但我更喜欢将它们分开,它们更易于阅读。

这些查询仅在使用 id 正确排序记录时才有效,否则不会!

于 2012-10-23T18:15:12.240 回答