Хммм. . . Если ваши перекрытия "простые", вы можете использовать кумулятивное min()
, чтобы получить следующее время начала, и использовать его для создания "скорректированной" продолжительности:
select agent,
sum(case when next_starttime < endtime
then datediff(second, starttime, next_starttime)
else duration
end)
from (select t.*,
min(starttime) over (partition by agent order by starttime) as next_starttime
from t
) t
group by agent;
Проще говоря, я имею в виду, что вызов полностью "заключает" другой вызов. Так что это разрешено:
A------B--A-------B
Но не:
A-------B--B------A
Общая проблема перекрытия определенно разрешима, но она гораздо сложнее. Учитывая, что ваши перекрытия такие простые, этого должно быть хорошо. Если вам нужно более общее решение, я бы предложил задать новый вопрос с соответствующими выборочными данными и желаемыми результатами.