sql >> Databasteknik >  >> RDS >> Oracle

Så här hittar du mest överlappande tidsperioder med datumintervall

Det finns flera tillvägagångssätt för detta. Man använder korrelerade delfrågor. Det är inte särskilt kul. Låt oss istället använda den kumulativa summametoden eftersom du har Oracle.

Nyckeln är att börja med en lista med tidsstämplar med värdet +1 för en start och -1 för ett slut. Det här är enkelt:

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

Nu, den kumulativa summan av value talar om för dig antalet aktiva överlappningar vid varje given tidpunkt:

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

Detta löser ditt problem. Du vill förmodligen lägga till en order by numactives desc för de specifika tiderna.



  1. Beställa SQL Server-resultat efter IN-klausul

  2. Hur man får radnummer i PostgreSQL

  3. En situation där ActiveRecord och SQL inte returnerar samma resultat på grund av att okänt OID behandlas som String

  4. Min bild i min databas publiceras inte på min sida (PHP MySQL)