SQL平均到达间隔时间,日期之间的时间

时间:2011-03-17 14:39:33

标签: sql postgresql

我有一个包含连续时间戳的表:

2011-03-17 10:31:19

2011-03-17 10:45:49

2011-03-17 10:47:49 ...

我需要在几秒钟内找到每个(可能有几十个)之间的平均时差,或者最简单的事情,我可以从那里开始使用它。因此,例如,仅前两次的上述到达间隔时间将是870(14m 30s)。这三次都是:(870 + 120)/ 2 = 445(7m 25s)。

注意,我正在使用postgreSQL 8.1.22。

编辑:我上面提到的表来自不同的查询,实际上只是一列时间戳列表

3 个答案:

答案 0 :(得分:15)

我不确定我完全理解你的问题,但这可能就是你想要的:

SELECT avg(difference)
FROM ( 
  SELECT timestamp_col - lag(timestamp_col) over (order by timestamp_col) as difference
  FROM your_table
) t

内部查询计算每行与前一行之间的距离。结果是表中每行的间隔。

外部查询只是对所有差异进行平均。

答案 1 :(得分:1)

我想你想找到平均值(timestamptz)。

我的解决方案是avg(当前 - 最小值)。但由于结果是间隔,所以再次将其添加到最小值。

SELECT  avg(target_col - (select min(target_col) from your_table))
        + (select min(target_col) from your_table)
FROM    your_table

答案 2 :(得分:1)

如果您无法升级到支持窗口功能的PG版本,那么 可以计算你的表的顺序步骤“缓慢的方式。”

假设您的表是“tbl”且您的时间戳列是“ts”:

SELECT AVG(t1 - t0)
  FROM (
        -- All this silliness would be moot if we could use
        -- `` lead(ts) over (order by ts) ''
        SELECT tbl.ts  AS t0,
               next.ts AS t1
          FROM tbl
         CROSS JOIN
               tbl next
         WHERE next.ts = (
                          SELECT MIN(ts)
                            FROM tbl subquery
                           WHERE subquery.ts > tbl.ts
                         )
       ) derived;

但不要这样做。它的表现会很糟糕。请做什么 a_horse_with_no_name建议,use window functions