Oracle
 sql >> Database >  >> RDS >> Oracle

Come trovare il periodo di tempo più sovrapposto con intervalli di date

Ci sono diversi approcci a questo. Uno usa subquery correlate. Non è molto divertente. Invece, utilizziamo il metodo della somma cumulativa perché hai Oracle.

La chiave è iniziare con un elenco di timestamp con un valore di +1 per un inizio e -1 per una fine. Questo è facile:

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

Ora, la somma cumulativa del value ti dice il numero di sovrapposizioni attive in un dato momento:

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

Questo risolve il tuo problema. Probabilmente vuoi aggiungere un order by numactives desc per gli orari specifici.