Vous pouvez attribuer un identifiant de groupe aux enregistrements. L'idée est de trouver des enregistrements qui ne se chevauchent pas et de les utiliser comme début d'un groupe.
Ce qui suit affecte les groupes à chaque enregistrement :
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
Si vous ne voulez que les groupes pour un certain enregistrement, il existe plusieurs façons, telles que :
with overlaps as (
<query above>
)
select o.*
from overlaps o
where o.grp = (select o2.grp from overlaps o2 where o2.id = ???);