【问题标题】:Calculate Consecutive Concurrent Calls SQL Server计算连续并发调用 SQL Server
【发布时间】:2021-03-19 04:44:33
【问题描述】:

我只有基本的 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 个电话

以下是一些数据的示例。

【问题讨论】:

    标签: sql sql-server datetime count unpivot


    【解决方案1】:

    这里的关键是拥有(或生成)一个表,每个时间段都有一行。然后是一个简单的 APPLY 或标量子查询:

    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
    

    【讨论】:

    • 我在哪里添加我拉的表?抱歉,只有非常基本的 sql 技能
    【解决方案2】:

    您可以通过取消透视列,然后使用窗口函数来做到这一点:

    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)
    

    【讨论】:

    • 当我尝试这个时,我得到一个错误。不识别几个选项...x.call_time ,cnt_calls,订单高亮显示为错误
    • @AdamRogers15:我修正了一些错别字。
    • 这行得通,但是我在某些日子开始时收到负值,你知道那会是什么吗?我还添加了一个接近于仅按其中 1 天过滤的位置,有没有更简单的方法可以按每天的最大数量对其进行分解,所以我只看到:今天的日期和最大数量,昨天的日期和最大数量
    • @AdamRogers15:查询原样无法生成负数。如果要过滤,则需要在外部查询中进行(而不是在查询本身中),否则跨日边界发生的调用被计为-1(我猜这就是这里发生的事情)。请参阅我的更新以了解如何获得每日高峰。
    • 是的,我可以看到一些负面消息出现在一天的开始,因为晚上的电话还没有结束。但是,当我对每天的最大值运行最后一次更正时,最大值的某些天数为负数,你能在脚本中看到可能的错误吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2020-05-23
    • 2010-12-06
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多