Đây là quy trình 3 bước, trước tiên hãy xếp hạng hồ sơ của bạn cho từng kết hợp Tài khoản / Mét bằng cách sử dụng ROW_NUMBER ()
SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter
ĐẦU RA
Số tài khoản | Số Mét | Ngày bắt đầu | Ngày kết thúc | Mã tỷ lệ | RowNumber |
---|---|---|---|---|---|
0142628117 | 123470203 | 2020-04-22 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470203 | 2019-04-10 | 2020-04-09 | *** Tùy chỉnh *** | 2 |
0142628117 | 123470205 | 2020-04-22 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 2019-04-10 | 2020-04-09 | *** Tùy chỉnh *** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | *** Tùy chỉnh *** | 1 |
1363445 | 105238304 | 2016-02-25 | 2016-04-22 | *** Tùy chỉnh *** | 2 |
1363445 | 130359929 | 2019-08-12 | 9999-12-31 | *** Tùy chỉnh *** | 1 |
N.B. Một số dữ liệu được rút ngắn để hiển thị tốt hơn
Sau đó, bạn có thể lọc RowNumber =1 để có ngày kết thúc mới nhất cho mỗi mét.
Tiếp theo, bạn cần đếm các kết hợp EndDate / RateCode riêng biệt, bạn không thể sử dụng COUNT(DISTINCT ...)
trong một hàm cửa sổ, tuy nhiên, bạn có thể mô phỏng điều này bằng cách sử dụng 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;
ĐẦU RA
Số tài khoản | Số Mét | Ngày bắt đầu | Ngày kết thúc | Mã tỷ lệ | 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 | *** Tùy chỉnh *** | 2 |
1363445 | 105238304 | 2018-10-02 | 2019-08-11 | *** Tùy chỉnh *** | 2 |
N.B. Một số dữ liệu được rút ngắn để hiển thị tốt hơn
Cuối cùng, đặt tất cả những điều này vào một truy vấn con hơn nữa và giới hạn ở nơi có nhiều hơn một sự kết hợp duy nhất của 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;
ĐẦU RA
Số tài khoản | Số Mét | Ngày bắt đầu | Ngày kết thúc | Mã tỷ lệ |
---|---|---|---|---|
0500000178767001363445 | TCA105238304 | 2018-10-02 | 2019-08-11 | *** Tùy chỉnh *** |
0500000178767001363445 | TCA130359929 | 2019-08-12 | 9999-12-31 | *** Tùy chỉnh *** |