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.