我有一个包含连续时间戳的表:
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。
编辑:我上面提到的表来自不同的查询,实际上只是一列时间戳列表
答案 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。