sql >> Databasteknik >  >> RDS >> Sqlserver

Hur får jag rekord med Max(datum) och jämför sedan värden för att få resultat

Detta är en process i tre steg, rangordna först dina poster för varje konto/mätarekombination med ROW_NUMBER()

SELECT *,
      RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber 
                                    ORDER BY EndDate DESC)
FROM Meter

OUTPUT

Kontonummer MeterNumber Startdatum Slutdatum RateCode RadNumber
0142628117 123470203 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470203 2019-04-10 2020-04-09 ***Anpassad*** 2
0142628117 123470205 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470205 2019-04-10 2020-04-09 ***Anpassad*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Anpassad*** 1
1363445 105238304 2016-02-25 2016-04-22 ***Anpassad*** 2
1363445 130359929 2019-08-12 9999-12-31 ***Anpassad*** 1

N.B. Vissa data har förkortats för att visas bättre

Sedan kan du filtrera efter var RowNumber =1 för att få det senaste slutdatumet för varje mätare.

Därefter måste du räkna de distinkta slutdatum/RateCode-kombinationerna, du kan inte använda COUNT(DISTINCT ...) i en fönsterfunktion, men du kan emulera detta med 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;

OUTPUT

Kontonummer MeterNumber Startdatum Slutdatum RateCode 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 ***Anpassad*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Anpassad*** 2

N.B. Vissa data har förkortats för att visas bättre

Lägg till sist allt detta i en ytterligare underfråga och begränsa till var det finns mer än en unik kombination av 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;

OUTPUT

Kontonummer MeterNumber Startdatum Slutdatum RateCode
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***Anpassad***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***Anpassad***

Exempel på db<>Fiddle




  1. Hur kan jag ändra prefix i alla tabeller i min MySQL DB?

  2. Oracle skapa tabell med kolumnkommentarer

  3. Stort bord i mysql Uppdaterar rader baserat på csv varje gång

  4. hur ställer man in kolumnvärdet lika med radnr?