sql >> Databáze >  >> RDS >> Sqlserver

Jak získám záznam s Max (datum) a poté porovnám hodnoty, abych získal výsledek

Toto je proces ve 3 krocích, nejprve seřaďte své záznamy pro každou kombinaci účtu/měřiče pomocí ROW_NUMBER()

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

VÝSTUP

Číslo účtu MeterNumber Datum zahájení Datum ukončení RateCode RowNumber
0142628117 123470203 22. 4. 2020 9999-12-31 ETF0_APR20 1
0142628117 123470203 2019-04-10 2020-04-09 ***Vlastní*** 2
0142628117 123470205 22. 4. 2020 9999-12-31 ETF0_APR20 1
0142628117 123470205 2019-04-10 2020-04-09 ***Vlastní*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Vlastní*** 1
1363445 105238304 25. 2. 2016 22. 4. 2016 ***Vlastní*** 2
1363445 130359929 2019-08-12 9999-12-31 ***Vlastní*** 1

N.B. Některé údaje byly zkráceny, aby se lépe zobrazovaly

Poté můžete filtrovat podle byly RowNumber =1, abyste získali poslední datum ukončení pro každý měřidlo.

Dále musíte spočítat různé kombinace EndDate/RateCode, nemůžete použít COUNT(DISTINCT ...) ve funkci v okně, můžete to však emulovat pomocí 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;

VÝSTUP

Číslo účtu MeterNumber Datum zahájení Datum ukončení RateCode CntDistinct
0142628117 123470203 22. 4. 2020 9999-12-31 ETF0_APR20 1
0142628117 123470205 22. 4. 2020 9999-12-31 ETF0_APR20 1
1363445 130359929 2019-08-12 9999-12-31 ***Vlastní*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Vlastní*** 2

N.B. Některé údaje byly zkráceny, aby se lépe zobrazovaly

Nakonec toto vše vložte do dalšího dílčího dotazu a omezte na místa, kde existuje více než jedna jedinečná kombinace 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;

VÝSTUP

Číslo účtu MeterNumber Datum zahájení Datum ukončení RateCode
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***Vlastní***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***Vlastní***

Příklad na db<>Fiddle




  1. Uložené procedury MySQL

  2. MySQL - odpovídající a neodpovídající výsledky v dotazu Where IN

  3. PreparedStatement a setTimestamp v oracle jdbc

  4. Tabulka historie SQL serveru – naplnit pomocí SP nebo Trigger?