Суммирование длительностей при наличии перекрытий в T SQL - PullRequest
0 голосов
/ 26 мая 2020

Итак, у меня есть таблица, которая дает мне результирующий набор с агентами и длительностью вызовов.

Я немного застрял, когда происходит перекрытие времени. См. Следующий пример таблицы:

Agent   |CallType   |StartTime              |EndTime                |Duration(s)    |Number
35171   |3          |06/01/2020 14:12:57    |06/01/2020 14:14:07    |70             |42572491
35171   |3          |06/01/2020 14:23:54    |06/01/2020 14:24:27    |33             |42572491
35171   |3          |06/01/2020 14:34:28    |06/01/2020 14:36:32    |124            |42572491
35171   |3          |06/01/2020 14:43:06    |06/01/2020 14:45:43    |157            |42572491
35171   |4          |06/01/2020 14:45:32    |06/01/2020 15:06:17    |1245           |42572491

Мне нужно получить общую продолжительность для этого агента, которая обычно требует суммирования столбца Duration. Однако, если вы посмотрите на последнюю строку, вы увидите, что время включения начинается за 11 секунд до окончания предыдущего вызова (строка выше), поэтому его не следует включать в общую (суммарную) продолжительность. Так что перекрытие следует исключить.

Любые указания о том, как я могу достичь этого на Sql сервере, были бы замечательными.

1 Ответ

1 голос
/ 26 мая 2020

Хммм. . . Если ваши перекрытия "простые", вы можете использовать кумулятивное 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

Общая проблема перекрытия определенно разрешима, но она гораздо сложнее. Учитывая, что ваши перекрытия такие простые, этого должно быть хорошо. Если вам нужно более общее решение, я бы предложил задать новый вопрос с соответствующими выборочными данными и желаемыми результатами.

...