Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment trouver des enregistrements avec des plages de dates qui se chevauchent de manière récursive dans Oracle DB

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 = ???);