假设此表:
id date
----------------
1 2010-12-12
2 2010-12-13
3 2010-12-18
4 2010-12-22
5 2010-12-23
如何仅使用MySQL查询找到这些日期之间的平均间隔?
例如,此表的计算将是
(
( 2010-12-13 - 2010-12-12 )
+ ( 2010-12-18 - 2010-12-13 )
+ ( 2010-12-22 - 2010-12-18 )
+ ( 2010-12-23 - 2010-12-22 )
) / 4
----------------------------------
= ( 1 DAY + 5 DAY + 4 DAY + 1 DAY ) / 4
= 2.75 DAY
答案 0 :(得分:39)
直观地说,你所要求的应该相当于第一个和最后一个日期之间的间隔,除以日期数减去1。
让我更彻底地解释一下。想象一下,日期是一行上的点(+
是日期,-
是缺少日期,第一个日期是第12日,我将最后日期更改为12月24日以用于说明目的):
++----+---+-+
现在,您真正想要做的是在这些行之间均匀地分隔日期,并找出它们之间的时间长度:
+--+--+--+--+
要做到这一点,你只需要花费最后一天和第一天之间的天数,在这种情况下,24 - 12 = 12,然后将它除以你必须空出的间隔数,在这种情况下为4:{ {1}}。
使用MySQL查询
12 / 4 = 3
这适用于此表(您的值返回2.75):
SELECT DATEDIFF(MAX(dt), MIN(dt)) / (COUNT(dt) - 1) FROM a;
答案 1 :(得分:2)
如果id均匀递增而没有间隙,请在id + 1:
上将表连接到自身SELECT d.id, d.date, n.date, datediff(d.date, n.date)
FROM dates d
JOIN dates n ON(n.id = d.id + 1)
然后根据需要进行GROUP BY和平均。
如果id不统一,请执行内部查询以首先分配有序ID。
我猜你还需要添加一个子查询来获取总行数。
<强>替代地强>
创建一个聚合函数,用于跟踪上一个日期以及运行的总和和计数。您仍然需要从子查询中选择以按日期强制排序(实际上,我不确定这是否在MySQL中得到保证)。
想想看,这是一个更好的方法。
甚至更简单
注意到Vegard的解决方案要好得多。
答案 2 :(得分:1)
以下查询返回正确的结果
SELECT AVG(
DATEDIFF(i.date, (SELECT MAX(date)
FROM intervals WHERE date < i.date)
)
)
FROM intervals i
但是它会运行一个从属子查询,它可能在没有索引且行数较多的情况下效率很低。
答案 3 :(得分:0)
您需要使用DATEDIFF函数进行自我加入并获得差异并获得平均值。