我試圖找到一個解決方案,包括在我的連接中使用row_number()方法,但不知何故無法獲得所需的結果。Oracle加入條件與頂部1
我現在遇到的問題是基於這樣一個事實,即我從連接表中得到了一些記錄,這些記錄具有多個實例(1到多個),並且引起重複的條件相同,所以即使我認爲我可以在一個日期使用min()或max(),我有相同的情況下出現兩次。
除此之外,如果我有實例,我沒有「活動」記錄(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
我也試着用我的「加盟」語句中以下,但不知何故,我不能利用內,我這裏有硬編碼值加盟鍵(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
我在這上面浪費了一個多小時,所以我需要別人的觀點! :)
錯誤地使用了'ROW_NUMBER'函數。你也應該用你的其他列對你的數據進行分區(所以'ROW_NUMBER'函數可以按你的日期對滿足一些條件的行進行排序) - 例子'ROW_NUMBER()OVER(通過ADDRID分區,EFFECTDT ORDER BY XPIRD DESC)'。最終,類似的'DENSE_RANK'就可以做到這一點。 – AndrewMcCoist