Jag är fortfarande inte klar över vilken post, i ditt exempel, du ville ha, så låt mig ge dig några alternativ.
Jag tog av din problemformulering att du vill ha det senaste ikraftträdandedatumet av de tillgängliga. Eftersom det finns kopplingar inblandade kan du inte använda max()
(som du redan har nämnt) och row_number()
är vägen att gå:
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
Nästa del var där du tappade bort mig med nollorna... Om din sekundära sortering är efter utgångsdatum och du vill att ett nullvärde ska övertrumfa det senaste utgångsdatumet, skulle du beställa efter utgångsdatumet och sätta 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
Vilket betyder att den här raden är vinnaren:
10948448 5/14/2015 <null>
Om du däremot ville att nulls endast skulle beaktas om det inte finns några utgångsdatum, kan du använda nulls last
(eller utelämna det, eftersom det är standard):
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
Det betyder att den här killen har vunnit priset:
10948448 5/14/2015 5/13/2015
Eftersom detta använder row_number()
du kommer inte att förlora några rader -- varje rad har garanterat ett radnummer. Det är bara det att om det finns sanna band, så är det en toss-up om vilken rad som väljs. Ditt problem med null utgångsdatum bör dock inte orsaka några problem med detta tillvägagångssätt.
-- redigera 2/13/16 --
Jag tror att jag börjar för att förstå ditt problem, men jag är inte 100% säker. Jag har infogat utdrag av din kod med den vänstra kopplingen med mitt förslag och behovet av att ha noll utgångsdatum först, och det här är min nästa spricka:
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
Förutsatt att detta inte gör det:
- När du säger att en noll XPIRDT har företräde -- menar du till och med över de senaste effektiva datumen, eller är det bara ett tiebreak för den senaste EFFECTDT? Om det senare, så borde det jag har fungera. Om det förra, då måste vi byta ordningsföljd efter i den analytiska funktionen
- Jag gissar helt när det kommer till
partyxref
ochmbr_person
tabeller. Om detta inte klipper det, kanske du lägger upp några exempeldata och önskad utdata för att inkludera dessa två tabeller, eller slängar det?