Ini adalah proses 3 langkah, pertama-tama beri peringkat catatan Anda untuk setiap kombinasi Akun/Pengukur menggunakan ROW_NUMBER()
SELECT *,
RowNumber = ROW_NUMBER() OVER(PARTITION BY AccountNumber, MeterNumber
ORDER BY EndDate DESC)
FROM Meter
OUTPUT
AccountNumber | MeterNumber | Tanggal Mulai | Tanggal Akhir | RateCode | RowNumber |
---|---|---|---|---|---|
0142628117 | 123470203 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470203 | 10-10-2019 | 09-04-2020 | ***Kustom*** | 2 |
0142628117 | 123470205 | 22-04-2020 | 9999-12-31 | ETF0_APR20 | 1 |
0142628117 | 123470205 | 10-10-2019 | 09-04-2020 | ***Kustom*** | 2 |
1363445 | 105238304 | 02-10-2018 | -11-08-2019 | ***Kustom*** | 1 |
1363445 | 105238304 | 25-02-2016 | 22-04-2016 | ***Kustom*** | 2 |
1363445 | 130359929 | 12-12-2019 | 9999-12-31 | ***Kustom*** | 1 |
N.B. Beberapa data dipersingkat untuk ditampilkan dengan lebih baik
Kemudian Anda dapat memfilter untuk RowNumber =1 untuk mendapatkan tanggal akhir terbaru untuk setiap meter.
Selanjutnya Anda perlu menghitung kombinasi EndDate/RateCode yang berbeda, Anda tidak dapat menggunakan COUNT(DISTINCT ...)
dalam fungsi berjendela, namun Anda dapat meniru ini menggunakan 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;
OUTPUT
AccountNumber | MeterNumber | Tanggal Mulai | Tanggal Akhir | 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 | 12-12-2019 | 9999-12-31 | ***Kustom*** | 2 |
1363445 | 105238304 | 02-10-2018 | -11-08-2019 | ***Kustom*** | 2 |
N.B. Beberapa data dipersingkat untuk ditampilkan dengan lebih baik
Terakhir, masukkan semua ini ke dalam subkueri lebih lanjut dan batasi jika terdapat lebih dari satu kombinasi unik 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;
OUTPUT
AccountNumber | MeterNumber | Tanggal Mulai | Tanggal Akhir | RateCode |
---|---|---|---|---|
0500000178767001363445 | TCA105238304 | 02-10-2018 | -11-08-2019 | ***Kustom*** |
0500000178767001363445 | TCA130359929 | 12-12-2019 | 9999-12-31 | ***Kustom*** |