SQL-запрос для определения списка ранжирования

Сегодня, работая над клиентским проектом, я столкнулся со следующей задачей: возьмите таблицу SQL «пользователь» со столбцами «id» и «score» и определите список ранжирования всех пользователей, отсортированных по «score», в котором пользователи с получить тот же рейтинг с одинаковым счетом. Эту задачу можно легко и интуитивно решить с помощью пользовательских переменных .


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)

Использование двух переменных решает эту проблему просто

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

и вы получите желаемый результат

+--------+-----------+----------+
|  *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   |
+--------+-----------+----------+
Назад