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