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