Dit is een proces van 3 stappen, rangschik eerst uw records voor elke Account/Meter-combinatie met ROW_NUMBER()
SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter
UITVOER
Accountnummer | MeterNummer | StartDatum | Einddatum | RateCode | Rijnummer |
---|---|---|---|---|---|
0142628117 | 123470203 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470203 | 2019-04-10 | 09-04-2020 | ***Aangepast*** | 2 |
0142628117 | 123470205 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 2019-04-10 | 09-04-2020 | ***Aangepast*** | 2 |
1363445 | 105238304 | 02-10-2018 | 2019-08-11 | ***Aangepast*** | 1 |
1363445 | 105238304 | 25-02-2016 | 22-04-2016 | ***Aangepast*** | 2 |
1363445 | 130359929 | 2019-08-12 | 9999-12-31 | ***Aangepast*** | 1 |
N.B. Sommige gegevens zijn ingekort om beter weer te geven
Vervolgens kunt u filteren op waren RowNumber =1 om de laatste einddatum voor elke meter te krijgen.
Vervolgens moet u de verschillende EndDate/RateCode-combinaties tellen, u kunt COUNT(DISTINCT ...)
niet gebruiken in een vensterfunctie, maar u kunt dit emuleren met 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;
UITVOER
Accountnummer | MeterNummer | StartDatum | Einddatum | 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 | 2019-08-12 | 9999-12-31 | ***Aangepast*** | 2 |
1363445 | 105238304 | 02-10-2018 | 2019-08-11 | ***Aangepast*** | 2 |
N.B. Sommige gegevens zijn ingekort om beter weer te geven
Zet dit alles tenslotte in een verdere subquery en beperk tot waar er meer dan één unieke combinatie van EndDate/RateCode is:
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;
UITVOER
Accountnummer | MeterNummer | StartDatum | Einddatum | RateCode |
---|---|---|---|---|
050000178767001363445 | TCA105238304 | 02-10-2018 | 2019-08-11 | ***Aangepast*** |
050000178767001363445 | TCA130359929 | 2019-08-12 | 9999-12-31 | ***Aangepast*** |