Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erhalte ich einen Datensatz mit Max (Datum) und vergleiche dann die Werte, um ein Ergebnis zu erhalten

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

Beispiel für db<>Fiddle