Questo è un processo in 3 fasi, prima classifica i tuoi record per ciascuna combinazione di account/contatore utilizzando ROW_NUMBER()
SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter
USCITA
Numero di conto | MeterNumber | StartDate | EndDate | RateCode | Numero riga |
---|---|---|---|---|---|
0142628117 | 123470203 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470203 | 10-04-2019 | 09-04-2020 | ***Personalizzato*** | 2 |
0142628117 | 123470205 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 10-04-2019 | 09-04-2020 | ***Personalizzato*** | 2 |
1363445 | 105238304 | 2018-10-02 | 11-08-2019 | ***Personalizzato*** | 1 |
1363445 | 105238304 | 25-02-2016 | 22-04-2016 | ***Personalizzato*** | 2 |
1363445 | 130359929 | 12-08-2019 | 9999-12-31 | ***Personalizzato*** | 1 |
NB Alcuni dati sono stati abbreviati per una migliore visualizzazione
Quindi puoi filtrare per RowNumber =1 per ottenere l'ultima data di fine per ogni metro.
Quindi devi contare le distinte combinazioni EndDate/RateCode, non puoi usare COUNT(DISTINCT ...)
in una funzione con finestra, tuttavia puoi emularla usando DENSE_RANK()
:
SELECT *,
CntDistinct = DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate, RateCode)
+ DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate DESC, RateCode DESC) - 1
FROM ( SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter AS m
) AS m
WHERE m.RowNumber = 1;
USCITA
Numero di conto | MeterNumber | StartDate | EndDate | RateCode | CntDistinct |
---|---|---|---|---|---|
0142628117 | 123470203 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
1363445 | 130359929 | 12-08-2019 | 9999-12-31 | ***Personalizzato*** | 2 |
1363445 | 105238304 | 2018-10-02 | 11-08-2019 | ***Personalizzato*** | 2 |
NB Alcuni dati sono stati abbreviati per una migliore visualizzazione
Infine, inserisci tutto questo in un'ulteriore sottoquery e limita a dove c'è più di una combinazione univoca di EndDate/RateCode:
SELECT AccountNumber, MeterNumber, StartDate, EndDate, RateCode
FROM ( SELECT *,
CntDistinct = DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate, RateCode)
+ DENSE_RANK() OVER(PARTITION BY AccountNumber
ORDER BY EndDate DESC, RateCode DESC) - 1
FROM ( SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter AS m
) AS m
WHERE m.RowNumber = 1
) AS m
WHERE m.CntDistinct > 1;
USCITA
Numero di conto | MeterNumber | StartDate | EndDate | RateCode |
---|---|---|---|---|
0500000178767001363445 | TCA105238304 | 2018-10-02 | 11-08-2019 | ***Personalizzato*** |
0500000178767001363445 | TCA130359929 | 12-08-2019 | 9999-12-31 | ***Personalizzato*** |