Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kondisi Bergabung Oracle dengan Top 1

Saya masih belum jelas rekaman mana, dalam contoh Anda, yang Anda inginkan, jadi izinkan saya memberi Anda beberapa alternatif.

Saya mengumpulkan dari pernyataan masalah Anda bahwa Anda menginginkan tanggal efektif terbaru dari yang tersedia. Karena ada ikatan yang terlibat, Anda tidak dapat menggunakan max() (seperti yang telah Anda nyatakan), dan row_number() adalah cara untuk pergi:

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

Bagian selanjutnya adalah di mana Anda kehilangan saya dengan nol... Jika pengurutan sekunder Anda berdasarkan tanggal kedaluwarsa dan Anda ingin nilai nol mengalahkan tanggal kedaluwarsa terbaru, maka Anda akan memesan berdasarkan tanggal kedaluwarsa dan menempatkan 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

Yang berarti baris ini adalah pemenangnya:

10948448    5/14/2015   <null>

Namun, jika Anda ingin nulls dipertimbangkan hanya jika tidak ada tanggal kedaluwarsa, Anda dapat menggunakan nulls last (atau hilangkan, karena ini adalah default):

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

Artinya orang ini telah memenangkan hadiah:

10948448    5/14/2015   5/13/2015

Karena ini menggunakan row_number() Anda tidak akan kehilangan baris apa pun -- setiap baris dijamin memiliki nomor baris. Hanya saja jika ada ikatan yang benar, maka itu adalah undian baris mana yang dipilih. Namun, masalah Anda dengan tanggal kedaluwarsa nol seharusnya tidak menyebabkan masalah dengan pendekatan ini.

-- edit 13/2/16 --

Saya pikir saya mulai untuk memahami masalah Anda, tetapi saya tidak 100% yakin. Saya telah memasukkan potongan kode Anda dengan bergabung kiri dengan saran saya, dan kebutuhan untuk memiliki tanggal kedaluwarsa nol terlebih dahulu, dan ini adalah celah saya berikutnya:

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

Dengan asumsi ini tidak berhasil:

  1. Bila Anda mengatakan XPIRDT null diutamakan -- apakah maksud Anda lebih dari tanggal efektif yang lebih baru, atau apakah itu hanya pemutus untuk EFFECTDT terbaru? Jika yang terakhir, maka apa yang saya miliki harus bekerja. Jika yang pertama, maka kita perlu mengganti urutannya dalam fungsi analitik
  2. Saya benar-benar menebak tentang partyxref dan mbr_person tabel. Jika ini tidak berhasil, mungkin kirimkan beberapa contoh data dan keluaran yang diinginkan untuk memasukkan kedua tabel tersebut, atau mainkan?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:pemicu kenaikan otomatis.

  2. Baru-baru ini menghadiri satu wawancara. Tidak dapat menjawab yang ini, dapatkah Anda membantu saya?

  3. Kesalahan waktu berjalan yang tidak ditentukan saat menjalankan skrip vba

  4. Membuat pemicu di Oracle Express

  5. Permintaan pivot Oracle SQL