Ini adalah bentuk jurang-dan-pulau. Dalam hal ini, tentukan di mana pulau-pulau itu dimulai dengan mencari tumpang tindih di awal. Kemudian, lakukan penjumlahan kumulatif dari awal dan agregasi:
select max(id), min(start), max(end), max(created_at)
from (select t.*,
count(*) filter (where max_end < end) over (order by start) as grouping
from (select t.*,
max(end) over (order by start rows between unbounded preceding and 1 preceding) as max_end
from events t
) t
) t
group by grouping;