Het is me nog steeds niet duidelijk welk record je in jouw voorbeeld wilde hebben, dus laat me je wat alternatieven geven.
Uit uw probleemstelling heb ik opgemaakt dat u de laatste ingangsdatum van de beschikbare gegevens wilt. Aangezien er banden bij betrokken zijn, kunt u max()
. niet gebruiken (zoals je al hebt aangegeven), en row_number()
is de juiste keuze:
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
Het volgende deel was waar je me verloor met de nulls... Als je secundaire sortering op vervaldatum is en je wilt dat een null-waarde de laatste vervaldatum overtroeft, dan zou je op de vervaldatum bestellen en 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
Wat betekent dat deze rij de winnaar is:
10948448 5/14/2015 <null>
Als u echter wilt dat nulls alleen in aanmerking worden genomen als er geen vervaldatums zijn, kunt u nulls last
gebruiken (of laat het weg, want het is de standaardinstelling):
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
Dit betekent dat deze man de prijs heeft gewonnen:
10948448 5/14/2015 5/13/2015
Aangezien dit row_number()
. gebruikt je verliest geen rijen -- elke rij heeft gegarandeerd een rijnummer. Het is alleen zo dat als er echte banden zijn, het een kwestie is van welke rij wordt gekozen. Uw probleem met vervaldatums van nul zou echter geen problemen moeten veroorzaken met deze aanpak.
-- bewerk 13-2-2016 --
Ik denk dat ik begin om uw probleem te begrijpen, maar ik ben niet 100% zeker. Ik heb fragmenten van je code opgenomen met de linker join met mijn suggestie, en de noodzaak om eerst een null-vervaldatum te hebben, en dit is mijn volgende crack:
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
Ervan uitgaande dat dit het niet doet:
- Als je zegt dat een nul XPIRDT voorrang heeft -- bedoel je dan zelfs over recentere ingangsdatums, of is het alleen een gelijkspel voor de meest recente EFFECTDT? Als het laatste het geval is, dan zou wat ik heb moeten werken. Als het eerste het geval is, moeten we de volgorde wijzigen in de analytische functie
- Ik gok helemaal als het gaat om de
partyxref
enmbr_person
tafels. Als dit niet voldoende is, post dan misschien wat voorbeeldgegevens en de gewenste uitvoer voor het opnemen van die twee tabellen, of speel het?