Dies ist ein 3-Schritte-Prozess, zuerst ordnen Sie Ihre Aufzeichnungen für jede Konto/Zähler-Kombination mit ROW_NUMBER()
SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter
AUSGABE
Kontonummer | Zählernummer | Startdatum | Enddatum | RateCode | Zeilennummer |
---|---|---|---|---|---|
0142628117 | 123470203 | 22.04.2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470203 | 2019-04-10 | 2020-04-09 | ***Benutzerdefiniert*** | 2 |
0142628117 | 123470205 | 22.04.2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 2019-04-10 | 2020-04-09 | ***Benutzerdefiniert*** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | ***Benutzerdefiniert*** | 1 |
1363445 | 105238304 | 25.02.2016 | 2016-04-22 | ***Benutzerdefiniert*** | 2 |
1363445 | 130359929 | 2019-08-12 | 9999-12-31 | ***Benutzerdefiniert*** | 1 |
Hinweis:Einige Daten zur besseren Darstellung gekürzt
Dann können Sie nach were RowNumber =1 filtern, um das späteste Enddatum für jeden Zähler zu erhalten.
Als nächstes müssen Sie die unterschiedlichen EndDate/RateCode-Kombinationen zählen, Sie können COUNT(DISTINCT ...)
nicht verwenden in einer Fensterfunktion, Sie können dies jedoch mit DENSE_RANK()
emulieren :
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;
AUSGABE
Kontonummer | Zählernummer | Startdatum | Enddatum | 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 | ***Benutzerdefiniert*** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | ***Benutzerdefiniert*** | 2 |
Hinweis:Einige Daten zur besseren Darstellung gekürzt
Setzen Sie all dies schließlich in eine weitere Unterabfrage und beschränken Sie sich darauf, wo es mehr als eine eindeutige Kombination von EndDate/RateCode gibt:
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;
AUSGABE
Kontonummer | Zählernummer | Startdatum | Enddatum | RateCode |
---|---|---|---|---|
0500000178767001363445 | TCA105238304 | 2018-10-02 | 2019-08-11 | ***Benutzerdefiniert*** |
0500000178767001363445 | TCA130359929 | 2019-08-12 | 9999-12-31 | ***Benutzerdefiniert*** |