将 T SQL 中存在重叠的持续时间相加



所以我有一个表,它给了我一个包含代理和呼叫持续时间的结果集。

当时间重叠发生时,我有点卡住了。请参阅下表示例:

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

我需要获取此代理的总持续时间,这通常需要对持续时间列求和。但是,如果您查看最后一行,您可以看到 startime 在上一次调用结束前 11 秒开始(上行(,因此这不应包含在总(总(持续时间中。因此,应省略重叠。

关于如何在 Sql Server 中实现这一点的任何方向都会很棒。

嗯。 . .如果您的重叠是"简单的",您可以使用累积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

一般的重叠问题肯定是可以解决的,但它相当复杂。 鉴于您的重叠如此简单,这应该没问题。 如果您需要更通用的解决方案,我建议您提出一个包含适当样本数据和所需结果的新问题。

最新更新