Saya masih belum jelas rekaman mana, dalam contoh Anda, yang Anda inginkan, jadi izinkan saya memberi Anda beberapa alternatif.
Saya mengumpulkan dari pernyataan masalah Anda bahwa Anda menginginkan tanggal efektif terbaru dari yang tersedia. Karena ada ikatan yang terlibat, Anda tidak dapat menggunakan max()
(seperti yang telah Anda nyatakan), dan row_number()
adalah cara untuk pergi:
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over (partition by addrid order by effectdt desc) as rn
from addrdata
)
select
addrid, effectdt, xpirdt
from cte
where rn = 1
Bagian selanjutnya adalah di mana Anda kehilangan saya dengan nol... Jika pengurutan sekunder Anda berdasarkan tanggal kedaluwarsa dan Anda ingin nilai nol mengalahkan tanggal kedaluwarsa terbaru, maka Anda akan memesan berdasarkan tanggal kedaluwarsa dan menempatkan nulls first
:
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over
(partition by addrid order by effectdt desc, xpirdt nulls first) as rn
from addrdata
)
select
addrid, effectdt, xpirdt
from cte
where rn = 1
Yang berarti baris ini adalah pemenangnya:
10948448 5/14/2015 <null>
Namun, jika Anda ingin nulls dipertimbangkan hanya jika tidak ada tanggal kedaluwarsa, Anda dapat menggunakan nulls last
(atau hilangkan, karena ini adalah default):
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over
(partition by addrid order by effectdt desc, xpirdt nulls last) as rn
from addrdata
)
select
addrid, effectdt, xpirdt
from cte
where rn = 1
Artinya orang ini telah memenangkan hadiah:
10948448 5/14/2015 5/13/2015
Karena ini menggunakan row_number()
Anda tidak akan kehilangan baris apa pun -- setiap baris dijamin memiliki nomor baris. Hanya saja jika ada ikatan yang benar, maka itu adalah undian baris mana yang dipilih. Namun, masalah Anda dengan tanggal kedaluwarsa nol seharusnya tidak menyebabkan masalah dengan pendekatan ini.
-- edit 13/2/16 --
Saya pikir saya mulai untuk memahami masalah Anda, tetapi saya tidak 100% yakin. Saya telah memasukkan potongan kode Anda dengan bergabung kiri dengan saran saya, dan kebutuhan untuk memiliki tanggal kedaluwarsa nol terlebih dahulu, dan ini adalah celah saya berikutnya:
with cte as (
select
addrid, effectdt, xpirdt,
row_number() over
(partition by addrid order by effectdt desc, xpirdt nulls first) as rn
from addrdata
)
select
cte.addrid, effectdt, xpirdt
from
mbr_person mb
left join partyxref px on
mb.nameid = px.nameid and
px.reftype = 'COMM'
left join cte on
px.refkey = cte.addrid and
cte.rn = 1
Dengan asumsi ini tidak berhasil:
- Bila Anda mengatakan XPIRDT null diutamakan -- apakah maksud Anda lebih dari tanggal efektif yang lebih baru, atau apakah itu hanya pemutus untuk EFFECTDT terbaru? Jika yang terakhir, maka apa yang saya miliki harus bekerja. Jika yang pertama, maka kita perlu mengganti urutannya dalam fungsi analitik
- Saya benar-benar menebak tentang
partyxref
danmbr_person
tabel. Jika ini tidak berhasil, mungkin kirimkan beberapa contoh data dan keluaran yang diinginkan untuk memasukkan kedua tabel tersebut, atau mainkan?