2016-11-10 77 views
0

我想連續計算幾天(行),這很容易(給出所有類似問題的答案)。但在我的數據集我已經連續行組的日期,如:如何統計連續的日期和按年份分組

1. 30/12/2010 
2. 31/12/2010 
3. 01/01/2011 
4. 02/01/2011 

看起來像一組(連續4天),但我想這組分成兩組。所以,當有:

1. 30/12/2010 
2. 31/12/2010 
3. 01/01/2011 
4. 02/01/2011 
5. 05/01/2011 
6. 06/02/2011 
7. 07/02/2011 

我想看到這個分爲四組(不是三個):

1. 30/12/2010 
2. 31/12/2010 

3. 01/01/2011 
4. 02/01/2011 

5. 05/01/2011 

6. 06/02/2011 
7. 07/02/2011 

我使用SQL Server 2014

+1

那麼規則是沒有任何組織應該延續多年? –

+0

按年份**和**月份連續分組? –

+0

只需將'YEAR(datecol)'添加到'PARTITION BY'。 – dnoeth

回答

1

您可以您的編號類似的行這樣的:

DECLARE @T TABLE(id INT, dt DATE); 

INSERT INTO @T VALUES 
(1, '2010-12-30'), 
(2, '2010-12-31'), 
(3, '2011-01-01'), 
(4, '2011-01-02'), 
(5, '2011-01-05'), 
(6, '2011-02-06'), 
(7, '2011-02-07'); 

WITH CTE1 AS (
    SELECT *, YEAR(dt) AS temp_year, ROW_NUMBER() OVER (ORDER BY dt) AS temp_rownum 
    FROM @T 
), CTE2 AS (
    SELECT CTE1.*, DATEDIFF(DAY, temp_rownum, dt) AS temp_dategroup 
    FROM CTE1 
) 
SELECT *, RANK() OVER (ORDER BY temp_year, temp_dategroup) AS final_rank 
FROM CTE2 
ORDER BY final_rank, dt 

結果:

id dt   temp_year temp_rownum temp_dategroup final_rank 
1 2010-12-30 2010  1   40539   1 
2 2010-12-31 2010  2   40539   1 
3 2011-01-01 2011  3   40539   3 
4 2011-01-02 2011  4   40539   3 
5 2011-01-05 2011  5   40541   5 
6 2011-02-06 2011  6   40572   6 
7 2011-02-07 2011  7   40572   6 

可以使用簡化查詢,但我選擇顯示所有列,以便更容易理解。 DATEDIFF技巧被複制from this answer