postgres选择聚合时间盘

时间:2016-12-01 21:02:48

标签: sql postgresql aggregate

我有一个具有以下结构的表:

timstamp-start, timestamp-stop
1,5
6,10
25,30
31,35
...

我只对连续时间跨度感兴趣,例如时间戳结束和下一个时间戳开始之间的中断小于3.

我怎样才能得到聚合的覆盖时间跨度:

timestamp-start,timestamp-stop
1,10
25,35

我考虑这个的原因是因为用户可能会请求需要返回几千行的时间跨度。但是,大多数记录是连续的,使用上述方法可能会将数千行减少到只有十几行。或者增加的计算不值得带宽和延迟的节省?

1 个答案:

答案 0 :(得分:2)

您可以分三个步骤对时间戳进行分组:

  1. 添加一个标志以确定新期间的开始位置(即大于3的间隙)。
  2. 累积标记以分配分组。
  3. 与新分组重新聚合。
  4. 代码如下:

    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;