sql >> Database >  >> RDS >> Sqlserver

Hoe krijg ik een record met Max (datum) en vergelijk ik waarden om resultaat te krijgen?

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

Voorbeeld op db<>Fiddle




  1. Is het mogelijk om een ​​variabele door te geven aan een opgeslagen procedure-aanroep in mysql?

  2. hoe de app te starten met SQLite darabase op de Android Studio-emulator?

  3. Hoe Emoji (UTF8 4 Byte tekens) in MySQL <5.5 . in te voegen

  4. Krijg Json-sleutels in een MySQL voor een bepaalde waarde