U kunt een groepsidentificatie aan de records toewijzen. Het idee is om records te vinden die elkaar niet overlappen, en ze te gebruiken als het begin van een groep.
Het volgende wijst de groepen toe aan elke record:
select t.*, sum(group_start) over (order by dstart) as grp
from (select t.*,
(case when not exists (select 1
from t t2
where t2.dstart < t.dstart and t2.dend >= t.dstart
)
then 1 else 0
end) group_start
from t
) t
Als u alleen de groepen voor een bepaald record wilt, dan zijn er verschillende manieren, zoals:
with overlaps as (
<query above>
)
select o.*
from overlaps o
where o.grp = (select o2.grp from overlaps o2 where o2.id = ???);