Това е процес от 3 стъпки, първо класирайте вашите записи за всяка комбинация акаунт/измервател, като използвате ROW_NUMBER()
SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter
ИЗХОД
AccountNumber | MeterNumber | Начална дата | Крайна дата | RateCode | Номер на ред |
---|---|---|---|---|---|
0142628117 | 123470203 | 22.04.2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470203 | 10.04.2019 | 09.04.2020 | ***По избор*** | 2 |
0142628117 | 123470205 | 22.04.2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 10.04.2019 | 09.04.2020 | ***По избор*** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | ***По избор*** | 1 |
1363445 | 105238304 | 25.02.2016 | 22.04.2016 | ***По избор*** | 2 |
1363445 | 130359929 | 2019-08-12 | 9999-12-31 | ***По избор*** | 1 |
N.B. Някои данни са съкратени за по-добро показване
След това можете да филтрирате дали RowNumber =1, за да получите последната крайна дата за всеки измервателен уред.
След това трябва да преброите отделните комбинации EndDate/RateCode, не можете да използвате COUNT(DISTINCT ...)
във функция с прозорец, но можете да емулирате това с помощта на 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;
ИЗХОД
AccountNumber | MeterNumber | Начална дата | Крайна дата | 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 | ***По избор*** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | ***По избор*** | 2 |
N.B. Някои данни са съкратени за по-добро показване
Накрая поставете всичко това в допълнителна подзаявка и ограничете до мястото, където има повече от една уникална комбинация от 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;
ИЗХОД
AccountNumber | MeterNumber | Начална дата | Крайна дата | RateCode |
---|---|---|---|---|
0500000178767001363445 | TCA105238304 | 2018-10-02 | 2019-08-11 | ***По избор*** |
0500000178767001363445 | TCA130359929 | 2019-08-12 | 9999-12-31 | ***По избор*** |