Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So finden Sie Datensätze mit rekursiv überlappenden Datumsbereichen in Oracle DB

Sie können den Datensätzen eine Gruppenkennung zuweisen. Die Idee ist, Datensätze zu finden, die sich nicht überschneiden, und sie als Anfang einer Gruppe zu verwenden.

Im Folgenden werden die Gruppen jedem Datensatz zugewiesen:

  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

Wenn Sie die Gruppen nur für einen bestimmten Datensatz haben möchten, gibt es mehrere Möglichkeiten, wie zum Beispiel:

with overlaps as (
      <query above>
     )
select o.*
from overlaps o
where o.grp = (select o2.grp from overlaps o2 where o2.id = ???);