Query SQL per determinare una classifica

Oggi mi sono imbattuto nella seguente attività mentre lavoravo a un progetto di un cliente: prendere una tabella SQL "utente" con le colonne "id" e "punteggio" e determinare una classifica di tutti gli utenti ordinati per "punteggio" in cui gli utenti con il ottenere la stessa classifica con lo stesso punteggio. Questa attività può essere risolta in modo intuitivo e semplice utilizzando variabili definite dall'utente .


CREATE TABLE
    user(id INT, score INT);
INSERT INTO
    user(id, score)
VALUES
    (1, 10), (2, 40), (3, 55), (4, 10), (5, 5), (6, 20), (7, 30), (8, 70), (9, 30)

L'uso di due variabili risolve questo problema semplicemente

SET @score_prev = NULL;
SET @cur_rank = 0;
SELECT id, score, CASE
    WHEN @score_prev = score THEN @cur_rank
    WHEN @score_prev := score THEN @cur_rank := @cur_rank + 1
END AS rank
FROM user
ORDER BY score DESC

e ottieni l'output che desideri

+--------+-----------+----------+
|  *id*  |  *score*  |  *rank*  |
|    8   |      70   |      1   |
|    3   |      55   |      2   |
|    2   |      40   |      3   |
|    7   |      30   |      4   |
|    9   |      30   |      4   |
|    6   |      20   |      5   |
|    1   |      10   |      6   |
|    4   |      10   |      6   |
|    5   |       5   |      7   |
+--------+-----------+----------+
Indietro