Один метод - exists
:
select t.*,
(case when exists (select 1
from t t2
where t2.starttime <= t.starttime and
t2.endtime >= t.starttime
)
then 1 else 0
end) as dual_convo
from t;
Если я правильно понимаю, я думаю, что вы также можете использовать совокупный максимум:
select t.*,
(case when max(endtime) over (order by starttime, endtime
rows between unbounded preceding and 1 preceding
) > starttime
then 1 else 0
end) as dual_convo
from t;
В ваших данных есть только примеры, где предыдущий ряд перекрывается. Но, вероятно, вы могли бы иметь перекрытия на более ранних строках, например:
1 9
2 3
4 5
8 12
Все, кроме первого перекрытия, и только первое с «предыдущей» строкой.