我無法撰寫一個遞回函式來計算任何一天的活動客戶數量。
假設我有一張這樣的桌子:
| 客戶 | 開始日期 | 結束日期 |
|---|---|---|
| 1 | 22 年 1 月 1 日 | |
| 2 | 22 年 1 月 1 日 | 22 年 1 月 3 日 |
| 3 | 22 年 1 月 3 日 | |
| 4 | 22 年 1 月 4 日 | 22 年 1 月 5 日 |
| 5 | 22 年 1 月 4 日 | 22 年 1 月 6 日 |
| 6 | 22 年 1 月 7 日 | 22 年 1 月 9 日 |
我想回傳一個看起來像這樣的表:
| 日期 | NumActive |
|---|---|
| 22 年 1 月 1 日 | 2 |
| 22 年 1 月 2 日 | 2 |
| 22 年 1 月 3 日 | 3 |
| 22 年 1 月 4 日 | 4 |
| 22 年 1 月 5 日 | 4 |
| 22 年 1 月 6 日 | 3 |
| 22 年 1 月 7 日 | 3 |
| 22 年 1 月 8 日 | 3 |
| 22 年 1 月 9 日 | 4 |
有沒有辦法做到這一點?理想情況下,我將有一個固定的開始日期并轉到今天的日期。
我嘗試過的一些作品:
創建遞回日期表
為簡單起見,截斷至 2022 年 2 月 1 日:
WITH DateDiffs AS (
SELECT DATEDIFF(DAY, '2022-02-02', GETDATE()) AS NumDays
)
, Numbers(Numbers) AS (
SELECT MAX(NumDays) FROM DateDiffs
UNION ALL
SELECT Numbers-1 FROM Numbers WHERE Numbers > 0
)
, Dates AS (
SELECT
Numbers
, DATEADD(DAY, -Numbers, CAST(GETDATE() -1 AS DATE)) AS [Date]
FROM Numbers
)
我希望能夠遍歷該表中的日期,例如通過修改以下每個日期的查詢,例如通過@loopdate。然后 UNION ALL 到一個更大的最終查詢。我現在不知道如何運行查詢來計算活躍用戶的數量:
SELECT
COUNT(Client)
FROM clients
WHERE [Start Date] >= @loopdate AND ([End Date] <= @loopdate OR [End Date] IS NULL)
謝謝!
uj5u.com熱心網友回復:
在這種特殊情況下,您不需要任何遞回,您至少需要一個要報告的范圍內的日期串列,最好是永久日歷表。
出于演示的目的,您可以即時創建一些東西,并像這樣使用它,以及您外部加入的日期串列:
with dates as (
select top(9)
Convert(date,DateAdd(day, -1 Row_Number() over(order by (select null)), '20220101')) dt
from master.dbo.spt_values
)
select d.dt [Date], c.NumActive
from dates d
outer apply (
select Count(*) NumActive
from t
where d.dt >= t.StartDate and (d.dt <= t.EndDate or t.EndDate is null)
)c
看到這個演示小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/432427.html
