sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo obtengo un registro con Max (fecha) y luego comparo los valores para obtener el resultado?

Este es un proceso de 3 pasos, primero clasifique sus registros para cada combinación de Cuenta/Medidor usando ROW_NUMBER()

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

SALIDA

Número de cuenta Número de Medidor Fecha de inicio Fecha de finalización Código de Tarifa Número de Fila
0142628117 123470203 2020-04-22 9999-12-31 ETF0_APR20 1
0142628117 123470203 2019-04-10 2020-04-09 ***Personalizado*** 2
0142628117 123470205 2020-04-22 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 2016-04-22 ***Personalizado*** 2
1363445 130359929 2019-08-12 9999-12-31 ***Personalizado*** 1

N.B. Algunos datos abreviados para mostrarlos mejor

Luego, puede filtrar por RowNumber =1 para obtener la última fecha de finalización para cada medidor.

A continuación, debe contar las distintas combinaciones de EndDate/RateCode, no puede usar COUNT(DISTINCT ...) en una función de ventana, sin embargo, puede emular esto 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;

SALIDA

Número de cuenta Número de Medidor Fecha de inicio Fecha de finalización Código de Tarifa 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 ***Personalizado*** 2
1363445 105238304 2018-10-02 2019-08-11 ***Personalizado*** 2

N.B. Algunos datos abreviados para mostrarlos mejor

Finalmente, coloque todo esto en una subconsulta adicional y limite donde haya más de una combinación ú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;

SALIDA

Número de cuenta Número de Medidor Fecha de inicio Fecha de finalización Código de Tarifa
0500000178767001363445 TCA105238304 2018-10-02 2019-08-11 ***Personalizado***
0500000178767001363445 TCA130359929 2019-08-12 9999-12-31 ***Personalizado***

Ejemplo en db<>Fiddle