I have a list of timestamps and i want to tag them as a group when they are close enough (less than 15 sec intervall). This is what I want to have eventually :
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 | / |
Advertisement
Answer
Use lag()
and date comparisons to determine where a group begins. Then use a cumulative sum. You actually only want to include rows that have multiple rows in the group, so this is a little tricker than the simple gaps-and-islands problem:
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