我有兩個表RSLTS和聯繫人:SQL RANK()在PARTITION上連接表
RSLTS
QRY_ID | RES_ID | SCORE
-----------------------------
A | 1 | 15
A | 2 | 32
A | 3 | 29
C | 7 | 61
C | 9 | 30
聯繫
C_ID | QRY_ID | RES_ID
----------------------------
1 | A | 2
2 | A | 1
3 | C | 9
我試圖創建一份報告顯示,對於每個CONTACT記錄((QRY_ID
)內的RSLTS表中的RANK()
的RES_ID
(通過SCORE
)。使用上面的數據,它應該是這樣的:
C_ID | QRY_ID | RES_ID | SCORE | Rank
-----------------------------------------------
1 | A | 2 | 32 | 1
2 | A | 1 | 15 | 3
3 | C | 9 | 30 | 2
到目前爲止,我試過,但它在最後一行(和秩= 2的第二個,這也是錯誤的)
返回排名= 1SELECT
C.*
,R.SCORE
,RANK() OVER (PARTITION BY R.QRY_ID ORDER BY R.SCORE DESC)
FROM CONTACTS C LEFT JOIN RSLTS R
ON C.RES_ID = R.RES_ID
AND C.QRY_ID = R.QRY_ID
UPDATE:SQLFiddle
你確定嗎? [我得到您的預期結果](http://sqlfiddle.com/#!3/da810/1)。另外,所有的縮寫是什麼?你真的可以指'DENSE_RANK()'(這將關閉排名之間的差距)? –
感謝SQLFiddle。我在這裏的數據在本地顯示出不同的東西。我更新了這個SQLFiddle(http://sqlfiddle.com/#!3/6ef2f/1)中的數據,其中最後一條記錄應顯示rank = 2而不是1,因爲61> 30 – greener
目前您的結果等同於' RANK()OVER(ORDER BY r.score DESC)'....你確定你需要分區(你的排名沒有任何重複)。 –