Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Điều kiện tham gia Oracle với Top 1

Tôi vẫn chưa rõ bản ghi nào, trong ví dụ của bạn, bạn muốn, vì vậy hãy để tôi cung cấp cho bạn một số lựa chọn thay thế.

Tôi thu thập được từ tuyên bố vấn đề của bạn rằng bạn muốn ngày có hiệu lực mới nhất của những vấn đề có sẵn. Vì có các ràng buộc liên quan, bạn không thể sử dụng max() (như bạn đã nêu) và row_number() là con đường để đi:

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

Phần tiếp theo là nơi bạn đã đánh mất tôi với giá trị null ... Nếu sắp xếp thứ cấp của bạn là theo ngày hết hạn và bạn muốn giá trị null vượt qua ngày hết hạn gần nhất, thì bạn sẽ đặt hàng trước ngày hết hạn và đặt 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

Có nghĩa là hàng này là hàng chiến thắng:

10948448    5/14/2015   <null>

Tuy nhiên, nếu bạn muốn null chỉ được xem xét nếu không có ngày hết hạn, bạn có thể sử dụng nulls last (hoặc bỏ qua nó, vì nó là mặc định):

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

Có nghĩa là anh chàng này đã giành được giải thưởng:

10948448    5/14/2015   5/13/2015

Vì điều này sử dụng row_number() bạn sẽ không mất bất kỳ hàng nào - mỗi hàng được đảm bảo có một số hàng. Chỉ là nếu có các mối quan hệ thực sự, thì đó là một sự lật ngược về hàng nào được chọn. Tuy nhiên, vấn đề của bạn với ngày hết hạn sẽ không gây ra bất kỳ vấn đề nào với cách tiếp cận này.

- chỉnh sửa 13/02/16 -

Tôi nghĩ tôi đang bắt đầu để hiểu vấn đề của bạn, nhưng tôi không chắc 100%. Tôi đã kết hợp các đoạn mã của bạn với phép nối bên trái theo đề xuất của tôi và trước tiên cần có ngày hết hạn vô hiệu và đây là lần crack tiếp theo của tôi:

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

Giả sử điều này không làm được:

  1. Khi bạn nói XPIRDT rỗng được ưu tiên hơn - ý bạn là thậm chí qua những ngày có hiệu lực gần đây hơn, hay nó chỉ là điểm ngắt cho EFFECTDT gần đây nhất? Nếu sau này, thì những gì tôi có sẽ hoạt động. Nếu là cái trước, thì chúng ta cần chuyển đổi thứ tự của từng thứ trong hàm phân tích
  2. Tôi hoàn toàn đoán được khi nói đến partyxrefmbr_person những cái bàn. Nếu điều này không cắt giảm nó, có thể đăng một số dữ liệu mẫu và đầu ra mong muốn để bao gồm hai bảng đó hoặc chỉnh sửa nó?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thực thi một thủ tục được lưu trữ của Oracle trong EntityFramework

  2. Truy vấn đệ quy SQL trên bảng tự tham chiếu (Oracle)

  3. Làm thế nào để đoán trước và thoát khỏi báo giá đơn 'trong oracle

  4. số hàng tăng lên khi giá trị của trường thay đổi trong Oracle

  5. Hàm JSON_VALUE () trong Oracle