C'est une forme de vides et d'îlots. Dans ce cas, déterminez où les îles commencent en recherchant les chevauchements au début. Ensuite, faites une somme cumulée des démarrages et de l'agrégation :
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;