我有项目表,每个人都有它的开始时间和结束时间。
例如:
| 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内部)。我查看了聚合函数,但不知道这是否可能。找到这种平均差距的最佳方法是什么?
答案 0 :(得分: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
答案 1 :(得分:1)
SELECT DATEDIFF(开始,结束)AS average_gap FROM table
来自MySQL文档的@see DATEDIFF()
。
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))
答案 2 :(得分:0)
答案 3 :(得分:0)
这不是你纯粹在SQL查询中完成的事情,你将不得不将数据带入你的应用程序并确定这些间隔中的间隙和重叠。
这不会是一个微不足道的代码,但编写它应该很有趣。我建议循环遍历列表并将所有相交的间隔加在一起,直到留下一个或多个非相交的间隔,您可以用它来计算间隙。
答案 4 :(得分:0)
select avg(diff) FROM
( select @rt:=NULL,
@rt := if(datediff(start, @end)<0,0,datediff(start, @end)) diff,
@end := end from t) t;
答案 5 :(得分: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正确排序记录时才有效,否则不会!