所以我有一个表,它给了我一个包含代理和呼叫持续时间的结果集。
当时间重叠发生时,我有点卡住了。请参阅下表示例:
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
一般的重叠问题肯定是可以解决的,但它相当复杂。 鉴于您的重叠如此简单,这应该没问题。 如果您需要更通用的解决方案,我建议您提出一个包含适当样本数据和所需结果的新问题。