Mam dwie tabele RSLTS i kontakty:SQL RANK() na partycji, na połączonych tabelach
RSLTS
QRY_ID | RES_ID | SCORE
-----------------------------
A | 1 | 15
A | 2 | 32
A | 3 | 29
C | 7 | 61
C | 9 | 30
KONTAKT
C_ID | QRY_ID | RES_ID
----------------------------
1 | A | 2
2 | A | 1
3 | C | 9
Próbuję utworzyć raport, który pokaże dla każdego rekordu KONTAKT (C_ID
), RANK()
(przez SCORE
) w tabeli w swojej grupie (QRY_ID
). Wykorzystując dane powyżej, to będzie wyglądać następująco:
C_ID | QRY_ID | RES_ID | SCORE | Rank
-----------------------------------------------
1 | A | 2 | 32 | 1
2 | A | 1 | 15 | 3
3 | C | 9 | 30 | 2
Dotychczas próbowałem tego, ale zwraca Rank = 1 dla ostatniego rzędu (i rangi = 2 dla drugiego, który jest również źle)
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
Czy jesteś pewien? [Otrzymuję oczekiwane wyniki] (http://sqlfiddle.com/#!3/da810/1). Co się dzieje z wszystkimi skrótami? I czy naprawdę masz na myśli 'DENSE_RANK()' (co spowoduje zamknięcie "luk" między rankingami)? –
Dzięki za pytanie SQLFiddle. Dane, które mam tutaj na miejscu, pokazują coś innego. Zaktualizowałem dane w tym języku SQLFiddle (http://sqlfiddle.com/#!3/6ef2f/1), gdzie ostatni rekord powinien pokazywać rank = 2 zamiast 1, ponieważ 61> 30 – greener
W chwili, gdy twoje wyniki są równoważne z ' RANK() OVER (ORDER BY r.score DESC) '.... Czy na pewno chcesz podzielić (nie ma żadnych powtórzeń w rankingu). –