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

So finden Sie die meisten überlappenden Zeiträume mit Datumsbereichen

Dazu gibt es mehrere Ansätze. Man verwendet korrelierte Unterabfragen. Das macht nicht viel Spaß. Lassen Sie uns stattdessen die kumulative Summenmethode verwenden, weil Sie Oracle haben.

Der Schlüssel ist, mit einer Liste von Zeitstempeln mit einem Wert von +1 für den Anfang und -1 für das Ende zu beginnen. Das ist ganz einfach:

select t.*
from ((select starttime as thetime, 1 as value from table t) union all
      (select endtime, -1 as value from table t)
     ) t

Nun die kumulierte Summe des value gibt Ihnen die Anzahl aktiver Überschneidungen zu einem bestimmten Zeitpunkt an:

select t.*, sum(value) over (order by thetime) as numactives
from ((select starttime as thetime, 1 as value from table t) union all
      (select endtime, -1 as value from table t)
     ) t

Dies löst Ihr Problem. Wahrscheinlich möchten Sie eine order by numactives desc hinzufügen für die bestimmten Zeiten.