K tomu existuje několik přístupů. Jeden používá korelované poddotazy. To není moc zábavné. Místo toho použijme metodu kumulativního součtu, protože máte Oracle.
Klíčem je začít se seznamem časových razítek s hodnotou +1 pro začátek a -1 pro konec. Je to snadné:
select t.*
from ((select starttime as thetime, 1 as value from table t) union all
(select endtime, -1 as value from table t)
) t
Nyní kumulativní součet value
vám říká počet aktivních překrytí v daném okamžiku:
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
Tím je váš problém vyřešen. Pravděpodobně budete chtít přidat order by numactives desc
pro konkrétní časy.