sql >> Database >  >> RDS >> Oracle

Oracle Join-voorwaarde met Top 1

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:

  1. 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
  2. Ik gok helemaal als het gaat om de partyxref en mbr_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?



  1. Hoe voer ik een PHP-query uit op geselecteerde optiekeuze met AJAX?

  2. django.db.utils.IntegrityError:kolom venue_city bevat null-waarden

  3. Hoe comprimeer ik deze Oracle-resultatenset in waarden volgens rijprioriteit, waarbij ik nulls negeer?

  4. Slaapstandfout bij uitvoeren van DDL via JDBC-instructie