2012-12-19 36 views
8

我有兩個表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的第二個,這也是錯誤的)

返回排名= 1
SELECT 
    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

+2

你確定嗎? [我得到您的預期結果](http://sqlfiddle.com/#!3/da810/1)。另外,所有的縮寫是什麼?你真的可以指'DENSE_RANK()'(這將關閉排名之間的差距)? –

+0

感謝SQLFiddle。我在這裏的數據在本地顯示出不同的東西。我更新了這個SQLFiddle(http://sqlfiddle.com/#!3/6ef2f/1)中的數據,其中最後一條記錄應顯示rank = 2而不是1,因爲61> 30 – greener

+0

目前您的結果等同於' RANK()OVER(ORDER BY r.score DESC)'....你確定你需要分區(你的排名沒有任何重複)。 –

回答

11

由於排名不從接觸取決於所有

RANKED_RSLTS

QRY_ID | RES_ID | SCORE | RANK 
------------------------------------- 
    A  | 1  | 15 | 3 
    A  | 2  | 32 | 1 
    A  | 3  | 29 | 2 
    C  | 7  | 61 | 1 
    C  | 9  | 30 | 2 

這樣:

SELECT 
    C.* 
    ,R.SCORE 
    ,MYRANK 
FROM CONTACTS C LEFT JOIN 
(SELECT *, 
MYRANK = RANK() OVER (PARTITION BY QRY_ID ORDER BY SCORE DESC) 
    FROM RSLTS) R 
ON C.RES_ID = R.RES_ID 
AND C.QRY_ID = R.QRY_ID 
+0

這工作。非常感謝。 – greener

0
SELECT a.C_ID,a.QRY_ID,a.RES_ID,b.SCORE,ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK] 
FROM CONTACTS a JOIN RSLTS b ON a.QRY_ID=b.QRY_ID AND a.RES_ID=b.RES_ID 
ORDER BY a.C_ID 
+0

請不要提供僅用於代碼的答案,但請說明解決方案爲什麼/如何工作。另請編輯您的代碼以正確顯示。 – jotasi

+0

當然,下次會做。只是一個新手,並試圖回答這個問題。感謝您的建議。 –

+0

你仍然可以編輯你的文章並添加解釋! – jotasi