2012-12-19 15 views
8

मैं दो तालिकाओं RSLTS और संपर्क पर:एसक्यूएल RANK() विभाजन से अधिक में शामिल हो गए टेबल

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 

मैं बनाने के लिए कोशिश कर रहा हूँ एक रिपोर्ट जो दिखाएगी, प्रत्येक संपर्क रिकॉर्ड (C_ID), RES_ID (SCORE द्वारा) आरएसएलटीएस अपने समूह के भीतर तालिका (QRY_ID) में। उपरोक्त डेटा का उपयोग करना, यह इस तरह दिखेगा: अब तक

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 

अद्यतन: SQLFiddle

+2

आपको यकीन है? [मुझे आपके अपेक्षित परिणाम मिलते हैं] (http://sqlfiddle.com/#!3/da810/1)। इसके अलावा, सभी संक्षेपों के साथ क्या हो रहा है? और हो सकता है कि आप वास्तव में 'DENSE_RANK()' (जो रैंकिंग के बीच 'अंतराल' बंद कर देंगे)? –

+0

SQLFiddle के लिए धन्यवाद। मेरे यहां स्थानीय रूप से मौजूद डेटा कुछ अलग दिखाया गया है। मैंने इस SQLFiddle (http://sqlfiddle.com/#!3/6ef2f/1) में डेटा अपडेट किया है, जहां अंतिम रिकॉर्ड 61> 30 – greener

+0

के बाद 1 के बजाय रैंक = 2 ​​दिखाना चाहिए, इस समय आपके परिणाम ' रैंक() ओवर (आरएसकोर डीईएससी द्वारा आदेश) '.... क्या आप वाकई विभाजन करने की जरूरत है (आपके पास अपनी रैंकिंग में कोई दोहराव नहीं है)। –

उत्तर

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

संबंधित मुद्दे