我一直在搜索,似乎无法找到一个问题,答案对我来说很好。我有一个包含近200万行的表,每行都有一个MySQL Date格式字段。
我想(以秒为单位)计算插入行的频率,因此使用SQL查询计算出所有行的日期之间的平均差异。
有什么想法吗?
- 编辑 -
这是我的表格的样子
id, name, date (datetime), age, gender
答案 0 :(得分:10)
如果您想知道插入行的频率(平均),我认为您不需要计算所有差异。您只需要总结相邻行之间的差异(基于时间戳的相邻行),并将结果除以加数的数量。
公式
((T1-T0) + (T2-T1) + … + (TN-TN-1)) / N
显然可以简化为
(TN-T0) / N
所以,查询将是这样的:
SELECT TIMESTAMPDIFF(SECOND, MIN(date), MAX(date)) / (COUNT(*) - 1)
FROM atable
确保行数大于1,否则您将得到Division By Zero错误。不过,如果您愿意,可以通过一个简单的技巧来防止错误:
SELECT
IFNULL(TIMESTAMPDIFF(SECOND, MIN(date), MAX(date)) / NULLIF(COUNT(*) - 1, 0), 0)
FROM atable
现在,您可以安全地针对具有单行的表运行查询。
答案 1 :(得分:3)
试一试:
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,a.date, 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
在我的第一个例子中,使用连接语法可以做很多事情来消除非高峰时段或没有新记录的大跨度。
答案 2 :(得分:1)
试试这个:
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