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
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)? –
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
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). –