Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como faço para obter o registro com Max (data) e, em seguida, comparar os valores para obter o resultado


Este é um processo de 3 etapas, primeiro classifique seus registros para cada combinação de conta/medidor usando ROW_NUMBER()
SELECT *,
      RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber 
                                    ORDER BY EndDate DESC)
FROM Meter

SAÍDA
AccountNumber MeterNumber Data de início EndDate RateCode RowNumber
0142628117 123470203 22-04-2020 9999-12-31 ETF0_APR20 1
0142628117 123470203 2019-04-10 2020-04-09 ***Personalizado*** 2
0142628117 123470205 22-04-2020 9999-12-31 ETF0_APR20 1
0142628117 123470205 2019-04-10 2020-04-09 ***Personalizado*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Personalizado*** 1
1363445 105238304 2016-02-25 22-04-2016 ***Personalizado*** 2
1363445 130359929 2019-08-12 9999-12-31 ***Personalizado*** 1

N.B. Alguns dados encurtados para serem exibidos melhor

Em seguida, você pode filtrar por RowNumber =1 para obter a data de término mais recente para cada medidor.

Em seguida, você precisa contar as combinações distintas de EndDate/RateCode, você não pode usar COUNT(DISTINCT ...) em uma função em janela, mas você pode emular isso usando 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;

SAÍDA
AccountNumber MeterNumber Data de início EndDate 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 ***Personalizado*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Personalizado*** 2

N.B. Alguns dados encurtados para serem exibidos melhor

Por fim, coloque tudo isso em uma subconsulta adicional e limite para onde há mais de uma combinação única de 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;

SAÍDA
AccountNumber MeterNumber Data de início EndDate RateCode
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***Personalizado***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***Personalizado***

Exemplo no db<>Fiddle