我正在努力解决这个问题。我甚至不知道如何问这个问题。我想得到同一时间内发生的呼叫的峰值计数。
我尝试将日期范围分解为几分钟(导致一个巨大的数据集),并获得在这些时间内发生的呼叫计数,但计数已关闭(我被关闭了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在该日期时间范围内没有发生呼叫。这是非常简化的,因为我们讨论的是全天的日期时间范围,可能只有几分钟或几秒钟。我需要找到每月的高峰期。所以对于这个例子,1月的峰值为2(我不需要知道确定数字的日期范围)
答案 0 :(得分: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年才支持。
所以,它确实是一招。它计算累计启动和停止次数。但是,这些仅在开始时间或结束时间记录中。要获取其他值,它还会计算总起点和终点数,并减去此值。因此,每个时间戳都有累计启动和停止次数。差异是并发呼叫的数量。