/* 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. */
Categories
BOT
(2)
C#
(1)
Cluster Analysis
(1)
Data Cleaning
(6)
Data Science Specialization
(11)
Data Visualization
(13)
Hadoop
(1)
Machine Learning
(3)
MapReduce
(1)
Maps
(1)
Markdown
(5)
Market Basket Analysis
(1)
MATLAB
(1)
Matplotlib
(3)
Numpy
(1)
Octave
(1)
Python
(12)
R
(20)
Regression
(4)
scikit-learn
(1)
Seaborn
(1)
Shiny App
(1)
SSIS
(3)
Statistical Inference
(2)
T-SQL
(9)

Grazie, è geniale. Davide
ReplyDelete