2015-04-19 16 views
7

Ho una tabella denominata DATA su Microsoft SQL Server 2008 R2 con tre campi interi non annullabili: ID, sequenza e valore. I valori di sequenza con lo stesso ID saranno consecutivi, ma possono iniziare con qualsiasi valore. Ho bisogno di una query che restituirà un conteggio di righe consecutive con lo stesso ID e Valore.SQL Server GROUP BY COUNT Solo righe consecutive

Per esempio, diciamo che ho i seguenti dati:

ID Sequence Value 
-- -------- ----- 
1   1  1 
5   1 100 
5   2 200 
5   3 200 
5   4 100 
10  10  10 

voglio il seguente risultato:

ID Start Value Count 
-- ----- ----- ----- 
1  1  1  1 
5  1 100  1 
5  2 200  2 
5  4 100  1 
10 10  10  1 

ho cercato

SELECT ID, MIN([Sequence]) AS Start, Value, COUNT(*) AS [Count] 
FROM DATA 
GROUP BY ID, Value 
ORDER BY ID, Start 

ma che dà

ID Start Value Count 
-- ----- ----- ----- 
1  1  1  1 
5  1 100  2 
5  2 200  2 
10 10  10  1 

che raggruppa tutte le righe con gli stessi valori, non solo righe consecutive.

Qualche idea? Da quello che ho visto, credo di dover lasciare unire il tavolo con se stesso su righe consecutive usando ROW_NUMBER(), ma non sono sicuro di come ottenere il conteggio.

Grazie in anticipo.

+2

Cerca [spazi e isole] (http://stackoverflow.com/questions/tagged/gaps-and-islands) –

risposta

9

È possibile utilizzare Sequence - ROW_NUMBER() OVER (ORDER BY ID, Val, Sequence) AS g per creare un gruppo:

SELECT 
    ID, 
    MIN(Sequence) AS Sequence, 
    Val, 
    COUNT(*) AS cnt 
FROM 
(
    SELECT 
    ID, 
    Sequence, 
    Sequence - ROW_NUMBER() OVER (ORDER BY ID, Val, Sequence) AS g, 
    Val 
    FROM 
    yourtable 
) AS s 
GROUP BY 
    ID, Val, g 

Si prega di vedere un violino here.