【问题标题】:How do I window Postgre SQL rows based on row data?如何根据行数据对 Postgresql 行进行窗口化?
【发布时间】:2021-08-29 11:50:42
【问题描述】:

我有一个包含时间戳列和一些数据列的表。给定间隔长度 T(比如 30 分钟),我想将表分区为“会话”。如果时间戳值的差异小于 T,则两个相邻行(按时间戳排序时)位于同一“会话”中。如果差异大于 T,则会话中断。例如,下表有两个大于 T 的间隔来分割会话。如何使用 SQL 生成会话列?

row timestamp session
1 18:00 1
2 18:02 1
3 18:04 1
4 18:30 1
5 19:10 2
6 19:20 2
7 20:20 3

【问题讨论】:

    标签: sql postgresql windowing


    【解决方案1】:

    您可以在时间戳上使用lag() 来测量差异,然后使用累积和来计算会话:

    select t.*,
           sum(case when prev_timestamp > timetamp - interval '30 minute' then 0 else 1 end) over
               (order by timestamp) as session
    from (select t.*,
                 lag(timestamp) over (order by timestamp) as prev_timestamp
          from t
         ) t;
    

    或者,您可以在 Postgres 中使用 count()filter

    select t.*,
           1 + count(*) filter (where prev_timestamp < timestamp - interval '30 minute') over (order by timestamp) as session
    from (select t.*,
                 lag(timestamp) over (order by timestamp) as prev_timestamp
          from t
         ) t;
    

    【讨论】:

    • @罗伯特。 . .如果这回答了您的问题,您可以接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多