Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je obtenir un enregistrement avec Max (date) puis comparer les valeurs pour obtenir un résultat

Il s'agit d'un processus en 3 étapes, classez d'abord vos enregistrements pour chaque combinaison compte/compteur à l'aide de ROW_NUMBER()

SELECT *,
      RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber 
                                    ORDER BY EndDate DESC)
FROM Meter

SORTIE

Numéro de compte Numéro de compteur Date de début Date de fin code de taux RowNumber
0142628117 123470203 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470203 2019-04-10 2020-04-09 ***Personnalisé*** 2
0142628117 123470205 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470205 2019-04-10 2020-04-09 ***Personnalisé*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Personnalisé*** 1
1363445 105238304 2016-02-25 2016-04-22 ***Personnalisé*** 2
1363445 130359929 2019-08-12 9999-12-31 ***Personnalisé*** 1

N. B. Certaines données raccourcies pour mieux s'afficher

Ensuite, vous pouvez filtrer si RowNumber =1 pour obtenir la dernière date de fin pour chaque compteur.

Ensuite, vous devez compter les combinaisons EndDate/RateCode distinctes, vous ne pouvez pas utiliser COUNT(DISTINCT ...) dans une fonction fenêtrée, mais vous pouvez l'émuler en utilisant 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;

SORTIE

Numéro de compte Numéro de compteur Date de début Date de fin code de taux CntDistinct
0142628117 123470203 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470205 2020-04-22 9999-12-31 ETF0_APR20 1
1363445 130359929 2019-08-12 9999-12-31 ***Personnalisé*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Personnalisé*** 2

N. B. Certaines données raccourcies pour mieux s'afficher

Enfin, mettez tout cela dans une autre sous-requête et limitez-vous là où il y a plus d'une combinaison unique de 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;

SORTIE

Numéro de compte Numéro de compteur Date de début Date de fin code de taux
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***Personnalisé***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***Personnalisé***

Exemple sur db<>Fiddle