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: prendre une table SQL "utilisateur" avec les colonnes "id" et "score" et déterminer un classement de tous les utilisateurs en fonction du "score" dans lequel les utilisateurs avec le obtenir le même classement avec le même score. Cette tâche peut être résolue intuitivement et facilement en utilisant des variables définies par l' utilisateur .


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