Ho due tavoli RSLTS e contatti:SQL RANK() su PARTITION su tabelle unite
RSLTS
QRY_ID | RES_ID | SCORE
-----------------------------
A | 1 | 15
A | 2 | 32
A | 3 | 29
C | 7 | 61
C | 9 | 30
CONTATTI
C_ID | QRY_ID | RES_ID
----------------------------
1 | A | 2
2 | A | 1
3 | C | 9
Sto cercando di creare un report che dovrebbe mostrare, per ogni record CONTACT (C_ID
), RANK()
di RES_ID
(da SCORE
) nella tabella RSLTS all'interno del relativo gruppo (QRY_ID
). Utilizzando i dati di cui sopra, sarebbe simile a questa:
C_ID | QRY_ID | RES_ID | SCORE | Rank
-----------------------------------------------
1 | A | 2 | 32 | 1
2 | A | 1 | 15 | 3
3 | C | 9 | 30 | 2
Finora, ho provato questo ma restituisce Classifica = 1 per l'ultima riga (e rango = 2 per il secondo, che è anche sbagliato)
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
Sei sicuro? [Ottengo i risultati attesi] (http://sqlfiddle.com/#!3/da810/1). Inoltre, che succede con tutte le abbreviazioni? E potresti davvero voler dire 'DENSE_RANK()' (che chiuderà 'spazi vuoti' tra le classifiche)? –
Grazie per SQLFiddle. I dati che ho qui localmente hanno mostrato qualcosa di diverso. Ho aggiornato i dati in questo SQLFiddle (http://sqlfiddle.com/#!3/6ef2f/1) dove l'ultimo record dovrebbe mostrare rank = 2 invece di 1 dal 61> 30 – greener
Al momento i tuoi risultati sono equivalenti a ' RANK() OVER (ORDER BY r.score DESC) '.... Sei sicuro di aver bisogno di partizionare (non hai alcuna ripetizione nella tua classifica). –