2016-11-10 6 views
0

Ich möchte aufeinanderfolgende Tage (Zeilen) zählen und das ist ziemlich einfach (mit allen Antworten auf ähnliche Fragen). Aber in meinem Datensatz habe ich Gruppen von aufeinanderfolgenden Zeilen mit Daten wie:Wie man aufeinanderfolgende Tage zählt und nach Jahr gruppiert

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

Sieht aus wie eine eine Gruppe (4 aufeinander folgenden Tagen), aber ich möchte diese Gruppe in zwei Gruppen aufgeteilt. Also, wenn mit:

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 

Ich möchte dies in vier Gruppen eingeteilt, um zu sehen (nicht drei):

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 

Ich bin mit SQL Server 2014

+1

Also ist die Regel, dass keine Gruppe sich über mehrere Jahre erstrecken sollte? –

+0

Gruppieren Sie aufeinanderfolgende Daten nach Jahr ** und ** Monat? –

+0

Fügen Sie einfach 'YEAR (datecol)' zu 'PARTITION BY' hinzu. – dnoeth

Antwort

1

Sie können Ihre Zeilen Anzahl wie dies:

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 

Ergebnis:

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 

Es ist möglich, die Abfrage zu vereinfachen, aber ich habe gewählt, um alle Spalten anzuzeigen, so dass es leichter zu verstehen ist. Der DATEDIFF Trick wurde kopiert from this answer.

Verwandte Themen