sql >> Databáze >  >> RDS >> Oracle

Oracle Join Condition with Top 1

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í:

  1. 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
  2. Naprosto se domnívám, že jde o partyxref a mbr_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?



  1. Filtr Ef core 5 many to many

  2. Jak NAČÍST DATOVÝ INFILE v mysql s prvním sloupcem Auto Increment?

  3. MYSQL:Jak zkopírovat celý řádek z jedné tabulky do druhé v mysql, přičemž druhá tabulka má jeden sloupec navíc?

  4. Oracle kontingenční řádky do sloupců