Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como encontrar registros com intervalos de datas sobrepostos recursivamente no Oracle DB


Você pode atribuir um identificador de grupo aos registros. A ideia é encontrar registros que não se sobreponham e usá-los como início de um grupo.

O seguinte atribui os grupos a cada registro:
  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

Se você deseja apenas os grupos para um determinado registro, existem várias maneiras, como:
with overlaps as (
      <query above>
     )
select o.*
from overlaps o
where o.grp = (select o2.grp from overlaps o2 where o2.id = ???);