T-SQL: Contare righe uguali consecutive

/* tabella di origine

Campo_0     Campo_1      Campo_2      Data
1                    7                     0                   2016-01-01
1                    7                     0                   2016-01-05
1                    9                     1                   2016-01-07
1                    9                     1                   2016-01-08
1                    7                     0                   2016-01-09
1                    9                     0                   2016-01-10
1                    9                     1                   2016-01-12
2                    9                     1                   2016-01-01
2                    9                     1                   2016-01-03
2                    9                     1                   2016-01-18
3                    9                     1                   2016-01-02

Voglio ottenere il numero di volte consecutive (in base alla data) che uno stesso valore di Campo_0 ha Campo_1 e Campo_2 uguali, indipendentemente dal fatto che in mezzo ci sia un altro valore di Campo_0 (quindi il valore di Campo_0=2 del 18/01/2016 deve essere sommato agli altri due perché in mezzo non c'è un valore diverso di Campo_1 e Campo_2 per Campo_0=2).
Il risultato che cerco quindi è questo:

 Campo_0     Campo_1      Campo_2      Data_min      Data_max      Numero
 1                   7                     0                     2016-01-01      2016-01-05        2
 1                     9                     1                     2016-01-07      2016-01-08        2
 1                     7                     0                     2016-01-09      2016-01-09        1
 1                     9                     0                     2016-01-10      2016-01-10         1
 1                     9                     1                     2016-01-12       2016-01-12         1      
 2                     9                     1                     2016-01-01      2016-01-18         3
 3                     9                     1                     2016-01-02      2016-01-02        1

La query per ottenerlo è la seguente: */


WITH Conteggio AS
(
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY Campo_0, Campo_1, Campo_2
         ORDER BY Data) AS grp_1,
         ROW_NUMBER() OVER (PARTITION BY Campo_0 ORDER BY Data) AS grp_2
  FROM Tabella
)

SELECT Campo_0,
       MIN(Data) AS Prima_data,
       MAX(Data) AS Ultima_Data,
       Campo_1,
       Campo_2,
       COUNT(Data) AS Numero
FROM Conteggio
GROUP BY Campo_0,
         grp_1 - grp_2,
         Campo_1,
         Campo_2
ORDER BY Numero DESC


/*Nella subquery, grp_1 numera i record raggruppandoli per Campo_0, 1 e 2, grp_2 li raggruppa solo per Campo_0.  Inserendo la differenza tra i due nel group by otteniamo il risultato. */



1 comment: