如何解决SQL计算总行之间的平均时间差
| 我已经搜索了SO,似乎找不到适合我的答案的问题。我有一个表,其中有近200万行,每行都有一个MySQL日期格式的字段。 我想算出插入行的频率(以秒为单位),所以用SQL查询算出所有行的日期之间的平均差。 有任何想法吗? -编辑- 这是我的桌子的样子id,name,date (datetime),age,gender
解决方法
如果您想知道每行插入一次(平均)的频率,我认为您无需计算所有差异。您只需要求和相邻行之间的差异(基于时间戳相邻),然后将结果除以求和数即可。
公式
((T1-T0)+(T2-T1)+…+(TN-TN-1))/ N
显然可以简化为
(TN-T0)/ N
因此,查询将如下所示:
SELECT TIMESTAMPDIFF(SECOND,MIN(date),MAX(date)) / (COUNT(*) - 1)
FROM atable
确保行数大于1,否则您将得到除以零的错误。不过,如果您愿意,您可以使用一个简单的技巧来防止错误:
SELECT
IFNULL(TIMESTAMPDIFF(SECOND,MAX(date)) / NULLIF(COUNT(*) - 1,0),0)
FROM atable
现在,您可以安全地对只有一行的表运行查询。
, 试一下:
select AVG(theDelay) from (
select TIMESTAMPDIFF(SECOND,a.date,b.date) as theDelay
from myTable a
join myTable b on b.date = (select MIN(x.date)
from myTable x
where x.date > a.date)
) p
内部查询将每一行与下一行(按日期)连接起来,并返回它们之间的秒数。然后对该查询进行封装,并查询平均秒数。
编辑:如果您的ID列是自动递增的,并且它们按日期顺序排列,则可以通过加入下一个ID行而不是MIN下一个日期来加快它的速度。
select AVG(theDelay) from (
select TIMESTAMPDIFF(SECOND,b.date) as theDelay
from myTable a
join myTable b on b.date = (select MIN(x.id)
from myTable x
where x.id > a.id)
) p
EDIT2:正如Mikael Eriksson的精彩评论一样,您也许可以做到:
select (TIMESTAMPDIFF(SECOND,(MAX(date),MIN(date)) / COUNT(*)) from myTable
在我的第一个示例中,可以使用join语法来做很多事情来消除非高峰时间或大范围而无需新的记录。
, 尝试这个:
select avg(diff) as AverageSecondsBetweenDates
from (
select TIMESTAMPDIFF(SECOND,t1.MyDate,min(t2.MyDate)) as diff
from MyTable t1
inner join MyTable t2 on t2.MyDate > t1.MyDate
group by t1.MyDate
) a
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。