2016-11-10 78 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