2012-12-19 6 views
8

Ich habe zwei Tabellen RSLTS und KONTAKTE:SQL RANK() über PARTITION auf verknüpften Tabellen

RSLTS

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

KONTAKTE

C_ID | QRY_ID | RES_ID 
---------------------------- 
    1 | A  | 2 
    2 | A  | 1 
    3 | C  | 9 

Ich versuche zu schaffen ein Bericht, der zeigen würde, für jede CONTACT Rekord ()), die RANK() von RES_ID (von SCORE) in der RSLTS Tabelle innerhalb ihrer Gruppe (QRY_ID). Unter Verwendung der obigen Daten, es würde wie folgt aussehen:

C_ID | QRY_ID | RES_ID | SCORE | Rank 
----------------------------------------------- 
    1 | A  | 2  | 32 | 1 
    2 | A  | 1  | 15 | 3 
    3 | C  | 9  | 30 | 2 

Bisher habe ich versucht, diese aber es gibt Rank = 1 für die letzte Zeile (und Rang = 2 für die zweite, die auch falsch ist)

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

Sind Sie sicher? [Ich bekomme Ihre erwarteten Ergebnisse] (http://sqlfiddle.com/#!3/da810/1). Was ist mit den Abkürzungen los? Und könntest du wirklich "DENSE_RANK()" meinen (was "Lücken" zwischen den Rankings schließt)? –

+0

Danke für das SQLFiddle. Die Daten, die ich hier vor Ort habe, zeigten etwas anderes. Ich habe die Daten in diesem SQLFiddle (http://sqlfiddle.com/#!3/6ef2f/1) aktualisiert, wobei der letzte Datensatz Rang = 2 statt 1 anzeigen sollte, da 61> 30 – greener

+0

Im Moment sind Ihre Ergebnisse äquivalent zu ' RANK() OVER (ORDER BY rs.score DESC) '.... Sind Sie sicher, dass Sie partitionieren müssen (Sie haben keine Wiederholungen in Ihrem Ranking). –

Antwort

11

Da der Rang hängt nicht an allen von den Kontakten

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 

So:

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

Das hat funktioniert. Danke vielmals. – 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

Bitte geben Sie keine Code-Only-Antworten an, sondern erklären Sie, warum/wie die Lösung funktioniert. Bitte bearbeiten Sie Ihren Code, um ihn korrekt anzuzeigen. – jotasi

+0

Sicher, wird das nächste Mal tun.Nur ein Neuling und versuchen, die Frage zu beantworten. Vielen Dank für Ihre Beratung. –

+0

Sie können Ihren Beitrag noch bearbeiten und eine Erklärung hinzufügen! – jotasi

Verwandte Themen