我只有基本的SQL技能,希望有人能帮我。我正在使用SQL Server尝试提出一个查询,以计算每天在同一时间发生的连续并发调用。我的公司只有300个并发呼叫的许可证,并试图找出我们每天达到的最大点数。基本上,如果3个人在9:00通话,所有3个通话在9:15结束,则计数为3。如果另一个通话发生在9:05,在9:20结束,则计数为4,但在9:16,计数仅为1。
我有一个表(conferencecall2),其中包含以下列:
CallID, UniqueCallID, Jointime, Leavetime 我们每天大约会接到5000-6000个电话
下面是一些数据的示例。

发布于 2020-12-08 05:08:54
这里的关键是创建(或生成)一个表,每个时间段对应一行。然后它是一个简单的应用或标量子查询:
select t.minute, c.calls
from time_table_with_one_row_per_minute t
cross apply
(
select count(*) calls
from calls c
where t.Minute >= c.JoinTime
and t.Minute <= c.LeaveTime
) c发布于 2020-12-08 05:13:02
您可以通过取消透视列,然后使用窗口函数来完成此操作:
select x.call_time, sum(sum(x.cnt_calls)) over(order by x.call_time) as cnt
from conferencecall2 c
cross apply (values (c.jointime, 1), (c.leavetime, -1)) as x(call_time, cnt_calls)
group by x.call_time这个解决方案只扫描一次表,所以我希望它能在大型数据集上高效地执行。
编辑:通过另一个级别的子查询,您可以获得每天并发调用的峰值:
select convert(date, call_time) as call_day, max(cnt) as peak_cnt
from (
select x.call_time, sum(sum(x.cnt_calls)) over(order by x.call_time) as cnt
from conferencecall2 c
cross apply (values (c.jointime, 1), (c.leavetime, -1)) as x(call_time, cnt_calls)
group by x.call_time
) c
group by convert(date, call_time)编辑2
如果要过滤,则需要在外部查询中执行此操作:
select convert(date, call_time) as call_day, max(cnt) as peak_cnt
from (
select x.call_time, sum(sum(x.cnt_calls)) over(order by x.call_time) as cnt
from conferencecall2 c
cross apply (values (c.jointime, 1), (c.leavetime, -1)) as x(call_time, cnt_calls)
group by x.call_time
) c
where call_time >= @endtime and call_time < @endtime
group by convert(date, call_time)https://stackoverflow.com/questions/65189150
复制相似问题