Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak znaleźć rekordy z rekursywnie nakładającymi się zakresami dat w Oracle DB?

Do rekordów można przypisać identyfikator grupy. Chodzi o to, aby znaleźć rekordy, które się nie nakładają, i wykorzystać je jako początek grupy.

Następujące czynności przypisują grupy do każdego rekordu:

  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

Jeśli chcesz, aby grupy dotyczyły tylko określonego rekordu, istnieje kilka sposobów, takich jak:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wprowadzenie do pakietów PL/SQL w bazie danych Oracle

  2. Instalowanie oprogramowania Oracle Database 12c w systemie Windows

  3. jak wybrać tylko wiersz z sekwencją max bez użycia podzapytania?

  4. dekodować w oracle przekonwertować na postgres

  5. Oracle:Jak sprawdzić, czy istnieje oczekująca transakcja?