我有一个具有以下结构的表:
timstamp-start, timestamp-stop
1,5
6,10
25,30
31,35
...
我只对连续时间跨度感兴趣,例如时间戳结束和下一个时间戳开始之间的中断小于3.
我怎样才能得到聚合的覆盖时间跨度:
timestamp-start,timestamp-stop
1,10
25,35
我考虑这个的原因是因为用户可能会请求需要返回几千行的时间跨度。但是,大多数记录是连续的,使用上述方法可能会将数千行减少到只有十几行。或者增加的计算不值得带宽和延迟的节省?
答案 0 :(得分:2)
您可以分三个步骤对时间戳进行分组:
代码如下:
select min(ts_start) as ts_start, max(ts_end) as ts_end
from (select t.*,
sum(flag) over (order by ts_start) as grouping
from (select t.*,
(coalesce(ts_start - lag(ts_end) over (order by ts_start),0) > 3)::int as flag
from t
) t
) t
group by grouping;