sql - oracle group by first row



甲骨文加入條件1 (1)

我試圖找到一個解決方案,包括在我的連接使用row_number()方法,但不知何故無法得到所需的結果。

我現在遇到的問題是基於這樣一個事實,即從連接表中有一些記錄有多個實例(1到多個),有相同的條件導致重複,所以即使我認為我可以使用分鐘()或max()在一個日期,我有相同的EffectDT的情況出來兩次。

除此之外 ,如果我有沒有“活動”記錄(XPIRDT IS NOT NULL)的實例,我需要拉過期的記錄,所以我會使用“OR”語句或者簡單地執行另一個連接來獲取在第一次連接沒有產生任何記錄並且有條件條件評估顯示之前的值的過期記錄?

所以下面是我正在處理的示例數據的一個實例:

因此,以上的數據樣本仍然產生2條記錄,我可以通過評估到期日期來消除一條記錄, 但是如果所有記錄都過期,將會出現問題,所以不會檢索任何內容。

 LEFT OUTER JOIN PARTYXREF
      ON MBR_PERSON.NAMEID = PARTYXREF.NAMEID
     AND PARTYXREF.REFTYPE LIKE 'COMM'
 LEFT JOIN (
                SELECT *
                FROM ADDRDATA TMP
                WHERE TMP.ADDRTYPE = '2'
                AND TMP.EFFECTDT = (SELECT MAX(EFFECTDT) FROM ADDRDATA TMP2 WHERE TMP2.ADDRID = TMP.ADDRID)
             )  MBR_ADDR
       ON PARTYXREF.REFKEY = MBR_ADDR.ADDRID  

我也嘗試過在我的“JOIN”語句中使用以下內容,但是我不知何故無法使用加密鍵(REFKEY),在這裡我有硬編碼的值,所以這實際上工作,但似乎無法納入加入聲明。

SELECT ADDR.*
FROM (SELECT tmp.*, row_number() OVER (ORDER BY XPIRDT DESC) AS SEQNUM
        FROM ADDRDATA tmp
        WHERE tmp.ADDRTYPE = '2'
          AND tmp.ADDRID = 10948448
       ) ADDR
WHERE SEQNUM = 1

我已經浪費了一個多小時,所以我需要別人的觀點! :)


我還不清楚哪個記錄是你想要的,所以讓我給你一些選擇。

我從你的問題陳述中收集到你想要的最新生效日期。 由於涉及到關係,所以不能使用max() (正如你已經說過的那樣),而row_number()是要走的路:

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

接下來的一部分就是你用空位讓我失去的地方...如果你的二級排序是到期日期,而你想要一個空值來勝過最後的到期日期,那麼你可以在到期日期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

這意味著這一排是贏家:

10948448    5/14/2015   <null>

但是,如果您只希望在沒有到期日期時考慮空值,則可以使用nulls last (或省略它,因為它是默認值):

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

這個傢伙贏得了這個獎項:

10948448    5/14/2015   5/13/2015

由於這使用了row_number() ,所以不會丟失任何行 - 每一行都保證有一個行號。 只是如果有真正的聯繫,那麼就是選擇哪一行。 但是,您的問題與空過期不應該導致任何問題,這種方法。

- 編輯2/13/16 -

我想我已經開始了解你的問題了,但我不是100%肯定的。 我已經將你的代碼片斷與我的建議的左連接合併在一起,並且需要首先有空過期日期,這是我的下一個裂縫:

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

假設這沒有做到這一點:

  1. 當你說空XPIRDT優先 - 你的意思是即使是最近的生效日期,或者它只是最近EFFECTDT的決勝者? 如果後者,那麼我應該工作。 如果前者,那麼我們需要在分析功能中切換按順序
  2. 我完全猜測到partyxrefmbr_person表。 如果這不能削減它,也許張貼一些樣本數據和所需的輸出包括這兩個表,或搗鼓它?




greatest-n-per-group