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