sql - postgres 选择聚合时间跨度

标签 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. 添加一个标志以确定新周期的开始位置(即大于 3 的间隙)。
  2. 对标志进行累计求和以分配分组。
  3. 重新聚合新的分组。

代码如下:

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;

关于sql - postgres 选择聚合时间跨度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920330/

相关文章:

mysql - 如何通过多个关系过滤 SQL 查询?

mysql - Group By 将 MySQL 转换为 PostgreSQL 的问题

sql - 涉及三个不同表的 SELECT 语句

python - 如何将 "union"重叠范围转为非重叠范围?

c# - LINQ JOIN + GROUP BY + SUM

R:基于因子或数字的聚合

sql - 按案例字段分组

sql - 将标识列值从另一个表插入到表中?

php - MYSQL错误结果输出

postgresql - 恢复 postgres 数据库挂起 - 没有错误