Stále mi není jasné, kterou nahrávku, ve vašem příkladu, jste chtěli, takže vám dovolte uvést několik alternativ.
Z vašeho prohlášení o problému jsem usoudil, že chcete poslední datum účinnosti z dostupných. Protože se jedná o remízy, nemůžete použít max()
(jak jste již uvedli) a row_number()
je správná cesta:
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
Další část byla, kde jste mě ztratili s nulami... Pokud je vaše sekundární řazení podle data vypršení platnosti a chcete, aby hodnota null překonala poslední datum vypršení platnosti, pak byste objednali podle data vypršení platnosti a na první místo umístili 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
Což znamená, že tato řada je vítězná:
10948448 5/14/2015 <null>
Pokud však chcete, aby byly hodnoty null brány v úvahu pouze v případě, že neexistují žádná data vypršení platnosti, můžete použít nulls last
(nebo jej vynechejte, protože je výchozí):
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
To znamená, že ten chlap vyhrál cenu:
10948448 5/14/2015 5/13/2015
Protože toto používá row_number()
neztratíte žádné řádky -- každý řádek bude mít zaručeně číslo řádku. Jde jen o to, že pokud existují skutečné remízy, pak je to los, který řádek se zvolí. Váš problém s nulovými daty vypršení platnosti by však s tímto přístupem neměl způsobit žádné problémy.
-- upravit 13. 2. 2016 --
Myslím, že začínám abych porozuměl vašemu problému, ale nejsem si 100% jistý. S mým návrhem jsem začlenil úryvky vašeho kódu s levým spojením a nutností mít nejdříve nulová data vypršení platnosti, a toto je můj další 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
Za předpokladu, že to tak není:
- Když říkáte, že nulový XPIRDT má přednost – máte na mysli dokonce i před novějšími daty účinnosti, nebo je to pouze nerozhodný výsledek pro nejnovější EFFECTDT? Pokud to druhé, mělo by fungovat to, co mám. Pokud první, pak musíme změnit pořadí podle v analytické funkci
- Naprosto se domnívám, že jde o
partyxref
ambr_person
tabulky. Pokud to nepomůže, můžete zveřejnit nějaká ukázková data a požadovaný výstup pro zahrnutí těchto dvou tabulek, nebo si s tím pohrát?