sql >> Databasteknik >  >> RDS >> Oracle

Oracle Join Condition med topp 1

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:

  1. 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
  2. Jag gissar helt när det kommer till partyxref och mbr_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?



  1. Uppdatera flera kolumner med django F()-objekt

  2. Finns det några gratisverktyg för att generera 'INSERT INTO'-skript i MS SQL Server?

  3. Vad är användningen av hakparenteser [] i sql-satser?

  4. Topp 5 PostgreSQL-frågeövervakningsverktyg