sql server—添加sql中存在重叠的持续时间

lnxxn5zx  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(263)

所以我有一个表,它给了我一个结果集,其中有代理和调用的持续时间。
当时间重叠时,我有点卡住了。见下表示例:

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秒开始,因此这不应该包括在总(sum)持续时间中。因此,应避免重叠。
关于如何在SQLServer中实现这一点的任何指导都是很好的。

jum4pzuy

jum4pzuy1#

嗯。如果重叠是“简单的”,那么可以使用累积 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

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

相关问题