我有一個具有以下結構的表:
| ID | 開始日期 (YY-MM-DD) | 結束日期 (YY-MM-DD) |
|---|---|---|
| 1 | 20-07-13 | 21-05-12 |
| 2 | 15-04-12 | 27-01-01 |
| 3 | 14-01-30 | 18-12-30 |
| 4 | 18-02-21 | |
| 5 | 20-12-12 | 20-12-15 |
| 6 | 20-11-11 | |
| 7 | 19-10-22 | 20-08-10 |
| 8 | 17-09-01 | 19-04-15 |
| 9 | 18-06-27 | 21-08-19 |
| 9 | 19-08-17 |
我想撰寫一個查詢來創建一個具有以下結構的輸出:計算每個時間段內活動的 ID。例如ID:1在2020年7月13日和2021年5月12日之間處于活動狀態,因此應將其添加到202007年和202105期間的計數中。只要現在有EndDate,則應將ID添加到計數中直到現在時期。
| COUNT_ID | 年年年月日 |
|---|---|
| 150 | 201601 |
| 200 | 201602 |
| 180 | 201603 |
| ... | ... |
| ... | ... |
| ... | ... |
我很難找到一種方法來計算每個時期的活動 ID 的數量,我相信有一種簡單的方法可以做到這一點,但不幸的是我不知道。
非常感謝任何幫助/提示/提示!
最好的問候,弗雷德里克
uj5u.com熱心網友回復:
如果我理解正確,你會想要:
生成開始日期(2016 年 6 月)和當前之間的月份開始和結束范圍表
然后,對于每個月,檢查有多少記錄的開始和結束日期包含該月內的任何天數
CREATE TABLE #temp_ids (id INT,
id_start DATE,
id_end DATE);
INSERT INTO #temp_ids (id, id_start, id_end) Values (1,'20200713','20210512');
INSERT INTO #temp_ids (id, id_start, id_end) Values (2,'20150412','20270101');
INSERT INTO #temp_ids (id, id_start, id_end) Values (3,'20140130','20181230');
INSERT INTO #temp_ids (id, id_start) Values (4,'20180221');
INSERT INTO #temp_ids (id, id_start, id_end) Values (5,'20201212','20201215');
INSERT INTO #temp_ids (id, id_start) Values (6,'20201111');
INSERT INTO #temp_ids (id, id_start, id_end) Values (7,'20191022','20200810');
INSERT INTO #temp_ids (id, id_start, id_end) Values (8,'20170901','20190415');
INSERT INTO #temp_ids (id, id_start, id_end) Values (9,'20180627','20210809');
INSERT INTO #temp_ids (id, id_start) Values (10,'20190817');
DECLARE @windowStart DATE = '20160101',
@windowEnd DATE = GETDATE();
;WITH report_dates AS (--This is a convenient piece of code to generate a table of dates between two dates
SELECT
TOP (DATEDIFF(DAY, @windowStart, @windowEnd) 1)
report_date = DATEADD(DAY,
ROW_NUMBER() OVER(ORDER BY a.object_id) - 1,
@windowStart)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b
),
month_windows AS (--Filter the dates we just generated to only month-start, and add month-end
SELECT report_date AS month_start,
EOMONTH(report_date) AS month_end
FROM report_dates
WHERE DATEPART(DAY, report_date) = 1
)
SELECT --Count the number of records which overlap with the month range
DISTINCT month_start,
month_end,
COUNT(id) AS count_id
FROM #temp_ids AS ti
JOIN month_windows mw ON ((ti.id_start <= mw.month_start AND ti.id_end >= mw.month_start)
OR (ti.id_start >= mw.month_start AND ti.id_start <= mw.month_end)
)
WHERE id_end IS NOT NULL
GROUP BY month_start,
month_end
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/380122.html
標籤:sql sql-server 查询语句
上一篇:SQL查詢結果上的SED
