本文介紹了Microsoft SQL Server 2016,T-SQL:基于單個日期獲取數據集的日期范圍的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我在SQL Server 2016中有一個有趣的情況。我正在使用T-SQL語言。
我有一個名為(#DataSet)的數據集:
名為ContinuousDates的最后一列將始終具有連續的日期值,沒有間隔,例如從2021年1月1日到2021年12月31日。它永遠不會有相同ID或名稱的重復日期,即一個人在給定的一天只能有一行數據。(在本例中,我只顯示了一個人,ID=1,姓名=X。在我的實際數據中,我有多個人)。
請注意,紐約市在數據集中出現在較早的位置,并在最后4行中重復出現。
我需要根據日期范圍獲取以下數據集:
我嘗試對數據集使用簡單的最小值和最大值,但我意識到有時可能會得到錯誤的輸出,如下所示:
我嘗試了使用RANK()和Dense_RANK()函數的一些選項,但無法找到解決方案。有人能為我提供幫助嗎?
我在這里附上了代碼:
CREATE TABLE #dataset
(
ID int,
Name varchar(20),
City varchar(20),
ContinuousDates date
)
INSERT INTO #dataset
VALUES(1,'X','NYC','1/1/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/2/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/3/2021')
INSERT INTO #dataset
VALUES(1,'X','SFO','1/4/2021')
INSERT INTO #dataset
VALUES(1,'X','SFO','1/5/2021')
INSERT INTO #dataset
VALUES(1,'X','PHY','1/6/2021')
INSERT INTO #dataset
VALUES(1,'X','PHY','1/7/2021')
INSERT INTO #dataset
VALUES(1,'X','PHY','1/8/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/9/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/10/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/11/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/12/2021')
SELECT *
FROM #dataset
ORDER BY ContinuousDates
為了更好地演示,我有一組新代碼:
CREATE TABLE #dataset
(
ID int,
Name varchar(20),
City varchar(20),
ContinuousDates date
)
INSERT INTO #dataset
VALUES(1,'X','NYC','1/1/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/2/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/3/2021')
INSERT INTO #dataset
VALUES(1,'X','SFO','1/4/2021')
INSERT INTO #dataset
VALUES(1,'X','SFO','1/5/2021')
INSERT INTO #dataset
VALUES(1,'X','PHY','1/6/2021')
INSERT INTO #dataset
VALUES(1,'X','PHY','1/7/2021')
INSERT INTO #dataset
VALUES(1,'X','PHY','1/8/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/9/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/10/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/11/2021')
INSERT INTO #dataset
VALUES(1,'X','NYC','1/12/2021')
INSERT INTO #dataset
VALUES(2,'Y','MEL','1/13/2021')
INSERT INTO #dataset
VALUES(3,'Z','SYD','1/14/2021')
INSERT INTO #dataset
VALUES(3,'Z','SYD','1/15/2021')
INSERT INTO #dataset
VALUES(3,'Z','PER','1/16/2021')
INSERT INTO #dataset
VALUES(4,'A',NULL,'1/16/2021')
INSERT INTO #dataset
VALUES(4,'A', NULL,'1/17/2021')
SELECT *
FROM #dataset
ORDER BY ID, ContinuousDates
推薦答案
解決方案步驟:
對ID和名稱按日期(Row_Id)排序的節進行編號
按日期(P_Row_Id)對ID、名稱和城市進行編號
計算row_id-p_row_id
現在,您有了唯一值集合中每個期間的組號。
您只需按此號碼、ID、姓名和城市進行分組
ID | 名稱 | 城市 | 連續日期 | p_row_id | row_id | row_id-p_row_id |
---|---|---|---|---|---|---|
1 | X | 紐約市 | 2021-01-01 | 1 | 1 | 0 |
1 | X | 紐約市 | 2021-01-02 | 2 | 2 | 0 |
1 | X | 紐約市 | 2021-01-03 | 3 | 3 | 0 |
1 | X | SFO | 2021-01-04 | 1 | 4 | 3 |
1 | X | SFO | 2021-01-05 | 2 | 5 | 3 |
1 | X | 物理層 | 2021-01-06 | 1 | 6 | 5 |
1 | X | 物理層 | 2021-01-07 | 2 | 7 | 5 |
1 | X | 物理層 | 2021-01-08 | 3 | 8 | 5 |
1 | X | 紐約市 | 2021-01-09 | 4 | 9 | 5 |
1 | X | 紐約市 | 2021-01-10 | 5 | 10 | 5 |
1 | X | 紐約市 | 2021-01-11 | 6 | 11 | 5 |
1 | X | 紐約市 | 2021-01-12 | 7 | 12 | 5 |
select
CD.ID
,CD.[Name]
,CD.City
,min(CD.ContinuousDates) as DateStart
,max(CD.ContinuousDates) as DateEnd
from
(
select *
,row_number() over(partition by CD.ID, CD.[Name], CD.City order by CD.ContinuousDates) as p_row_id
,row_number() over(partition by CD.ID, CD.[Name] order by CD.ContinuousDates) as row_id
from #dataset CD
) CD
group by CD.row_id - CD.p_row_id
,CD.ID
,CD.[Name]
,CD.City
order by DateStart
多列模板:
select
CD.GroupColumn1
,CD.GroupColumn2
..
,CD.Column1
,CD.Column2
,CD.Column3
,CD.Column4
..
,min(CD.ContinuousDates) as DateStart
,max(CD.ContinuousDates) as DateEnd
from
(
select *
,row_number() over(partition by
CD.GroupColumn1
,CD.GroupColumn2
..
,CD.Column1
,CD.Column2
,CD.Column3
,CD.Column4
..
order by CD.ContinuousDates) as p_row_id
,row_number() over(partition by
CD.GroupColumn1
,CD.GroupColumn2
..
order by CD.ContinuousDates) as row_id
from #dataset CD
) CD
group by CD.row_id - CD.p_row_id
,CD.GroupColumn1
,CD.GroupColumn2
..
CD.Column1
,CD.Column2
,CD.Column3
,CD.Column4
..
order by DateStart
這篇關于Microsoft SQL Server 2016,T-SQL:基于單個日期獲取數據集的日期范圍的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,