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, MIN(date), 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,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
在我的第一个示例中,可以使用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
    

要回复问题请先登录注册