मैं दो तालिकाओं 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 सेकंड के लिए जो भी गलत है)
के लिए रिटर्न रैंक = 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
अद्यतन: SQLFiddle
आपको यकीन है? [मुझे आपके अपेक्षित परिणाम मिलते हैं] (http://sqlfiddle.com/#!3/da810/1)। इसके अलावा, सभी संक्षेपों के साथ क्या हो रहा है? और हो सकता है कि आप वास्तव में 'DENSE_RANK()' (जो रैंकिंग के बीच 'अंतराल' बंद कर देंगे)? –
SQLFiddle के लिए धन्यवाद। मेरे यहां स्थानीय रूप से मौजूद डेटा कुछ अलग दिखाया गया है। मैंने इस SQLFiddle (http://sqlfiddle.com/#!3/6ef2f/1) में डेटा अपडेट किया है, जहां अंतिम रिकॉर्ड 61> 30 – greener
के बाद 1 के बजाय रैंक = 2 दिखाना चाहिए, इस समय आपके परिणाम ' रैंक() ओवर (आरएसकोर डीईएससी द्वारा आदेश) '.... क्या आप वाकई विभाजन करने की जरूरत है (आपके पास अपनी रैंकिंग में कोई दोहराव नहीं है)। –