在 Postgre 的时间序列中查找组

Finding groups within time series in Postgre

我有一个时间戳列表,我想在它们足够接近时(小于 15 秒间隔)将它们标记为一个组。这就是我最终想要的:

time group number
18:01:00 1
18:01:06 1
18:10:00 /
18:20:30 2
18:20:40 2
18:20:50 2
18:25:02 /

使用 lag() 和日期比较来确定组的开始位置。然后使用累计和。实际上,您只想在组中包含具有多行的行,因此这比简单的间隙和孤岛问题要复杂一些:

select t.*,
       (case when prev_time > time - interval '15 second' or
                  next_time < time + interval '15 second'
             then sum(case when prev_time > time - interval '15 sec' then 0 else 1 end) over (order by time)
        end) as group_number
  from (select t.*,
               lag(time) over (order by time) as prev_time,
               lead(time) over (order by time) as next_time
        from t
       ) t