Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso ottenere record con Max(date) e quindi confrontare i valori per ottenere il risultato

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***

Esempio su db<>Fiddle