Requête SQL pour déterminer une liste de classement

Aujourd'hui, je suis tombé sur la tâche suivante en travaillant sur un projet client : prenez une table SQL "user" avec les colonnes "id" et "score" et déterminez une liste de classement de tous les utilisateurs, triés en fonction du "score", dans laquelle les utilisateurs avec le même score obtiennent le même classement. En utilisant des variables définies par l'utilisateur, cette tâche peut être résolue de manière intuitive et simple.


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'utilisation de deux variables résout cela simplement:

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

et vous obtenez le résultat que vous voulez:

+--------+-----------+----------+
|  *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   |
+--------+-----------+----------+
Retour