Query SQL per determinare una classifica

Oggi mentre lavoro al progetto di un cliente mi sono imbattuto nel seguente compito: prendere una tabella SQL "utente" con le colonne "id" e "punteggio" e determinare una classifica di tutti gli utenti, ordinati in base al "punteggio", in cui gli utenti con lo stesso punteggio ottengono la stessa classifica. Utilizzando variabili definite dall'utente, questo compito può essere risolto in modo intuitivo e semplice.


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