Има няколко подхода за това. Човек използва корелирани подзаявки. Това не е много забавно. Вместо това нека използваме метода на кумулативната сума, защото имате Oracle.
Ключът е да започнете със списък от времеви марки със стойност +1 за начало и -1 за край. Това е лесно:
select t.*
from ((select starttime as thetime, 1 as value from table t) union all
(select endtime, -1 as value from table t)
) t
Сега кумулативната сума на value
ви казва броя на активните припокривания във всеки даден момент:
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
Това решава вашия проблем. Вероятно искате да добавите order by numactives desc
за конкретните часове.