我有很多 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)
是否有人有任何好的方法作為選擇中的下一個選擇(游標中的游標)或許多視圖 - 看起來像是重新發明輪子。
uj5u.com熱心網友回復:
如果沒有看到示例資料和預期結果,很難確定,但您似乎想要每天最多同時發生的事件數。
所以我們可以執行以下步驟:
- 將開始時間和結束時間拆分為單獨的行,為每行添加數量差異:
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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447370.html
