0

我正在努力解决工作中的这个问题。老实说,我什至不知道如何问这个问题。我想获得在同一时间发生的呼叫的峰值计数。

我尝试将日期范围分解为分钟(产生一个巨大的数据集)并计算在这些时间发生的呼叫计数,但计数已关闭(我减少了 10 倍),因为我知道总呼叫.

1 | 2012-01-01 01:15:00.000 | 2012-01-01 01:16:00.000
2 | 2012-01-01 01:14:00.000 | 2012-01-01 01:17:00.000
3 | 2012-01-01 01:18:00.000 | 2012-01-01 01:20:00.000

在第一次通话日期时间范围内,发生了 2 次通话(本身和第 2 次通话)。与 2 相同。呼叫 3 在该日期时间范围内未发生呼叫。这非常简化,因为我们谈论的是一天中的日期时间范围,范围可能是几分钟或几秒钟。我需要找到每个月的高峰。所以对于这个例子,一月的峰值为 2(我不需要知道决定数字的日期范围)

4

1 回答 1

1

这是我的首选方式。它从呼叫开始或停止的所有时间列表开始,然后计算同时呼叫的数量:

with t as (
     select starttime as thetime, 1 as isstart, 0 as isend
     from calls
     union all
     select endtime, 0 as isstart, 1 as issend
     from calls
   ),
   t2 as (
     select thetime, row_number() over (order by thetime) as numcalls,
            isstart, isend,
            row_number() over (partition by isstart order by thetime) as cumstartsorends
     from t
    ),
   t3 as (
     select thetime,
            (case when isstart = 1 then cumstartsorends
                  else numcalls - cumstartsorends
             end) as numstarts,
            (case when isend = 1 then cumstartsorends
                  else numcalls - cumstartsorends
             end) as numends
      from t2
     )
select year(thetime) as yr, month(thetime) as mon,
       max(numstarts - numends) as maxcum
from t3
group by year(thetime), month(thetime)

这个查询真正想做的是每次(开始时间或结束时间)的累积总和。但是,直到 2012 年才支持。

所以,它有一个技巧。它计算开始和停止的累积次数。但是,这些仅在开始时间或结束时间记录上。为了得到另一个值,它还计算总开始和停止,并减去这个值。因此,每个时间戳都有开始和停止的累积次数。区别在于并发调用的数量。

于 2012-09-14T21:00:14.310 回答