计算给定日期/间隔内使用的最大通道数,并指出这一天



我有很多CDR,他们想报告给定日期(每天(的同时通道。

所以我简单地说,在一个晚上,有0个通道被使用(这是事实,我过滤掉午夜后的呼叫(-这对统计数据的影响很小,并简化了计算,我使用了众所周知的游标(这是一个T-SQL,但可能更通用(

(
SELECT  date_start AS ts, +1 AS type,
ROW_NUMBER() OVER(ORDER BY date_start) AS start_ordinal
FROM [cdrs] with (nolock)
WHERE bill_id in ( 12345 )   and date_start between '2021-01-01' and '2022-03-14' 
UNION ALL
SELECT  date_end, -1, NULL
FROM [cdrs] with (nolock)
WHERE bill_id in ( 12345 )   and date_start between '2021-01-01' and '2021-03-14'
),
C2 AS
(
SELECT *,
ROW_NUMBER() OVER( ORDER BY ts, TYPE ) AS start_or_end_ordinal
FROM C1
)
SELECT  MAX(2 * start_ordinal - start_or_end_ordinal) AS max_channels
FROM C2
WHERE type = 1

(我也使用nolock来提高速度——简单地说,一天必须结束,所有的呼叫都必须结束,这样才能工作(。

我想实现的目标:

在这段时间内,每天都要使用";按年份((、月份((、日期((分组"不是解决方案(给出错误答案(还有下一步-对每个可能的bill_id(它是0..65535范围内的int(都有这个

有人有什么好的方法吗?比如在select中next select(光标在光标中(或许多视图——看起来像是重新发明轮子。

如果没有看到样本数据和预期结果,很难说是肯定的,但似乎您希望每天同时发生的事件数量达到最大。

因此,我们可以执行以下步骤:

  • 将开始和结束时间取消预览为单独的行,并为每行添加数量差异:1表示开始时间,-1表示结束时间
  • 计算差值的滚动和,按天划分
  • 按天分组,取滚动总和的最大值
SELECT
t.date,
maxSimultaneous = MAX(t.rollingQty)
FROM (
SELECT
date = CAST(v.ts AS date),
v.ts,
v.diffQuantity,
rollingQty = SUM(v.diffQuantity) OVER (PARTITION BY CAST(v.ts AS date) ORDER BY v.ts ROWS UNBOUNDED PRECEDING)
FROM cdrs
CROSS APPLY (VALUES
(cdrs.date_start, 1),
(cdrs.date_end,  -1)
) v(ts, diffQuantity)
WHERE cdrs.bill_id = 12345
AND cdrs.date_start >= '2021-01-01'
AND cdrs.date_start <  '2021-03-15'
) t
GROUP BY
t.date;

请注意,日期使用半开放间隔>= AND <,而不是BETWEEN

最新更新