sql >> Database >  >> RDS >> Oracle

Records vinden met recursief overlappende datumbereiken in Oracle DB

U kunt een groepsidentificatie aan de records toewijzen. Het idee is om records te vinden die elkaar niet overlappen, en ze te gebruiken als het begin van een groep.

Het volgende wijst de groepen toe aan elke record:

  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

Als u alleen de groepen voor een bepaald record wilt, dan zijn er verschillende manieren, zoals:

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



  1. MYSQL:Vind begin- en eindtijdstempel van een opeenvolgende telling

  2. databaseverbinding mislukt na het maken van een jar-bestand

  3. Hoe DATEDIFF() werkt in MariaDB

  4. Waaraan wijst Hibernate een boolean datatype toe bij standaard gebruik van een Oracle-database?