Рейтинг тизмесин аныктоо үчүн SQL сурамы

Бүгүн мен кардар долбоорунун үстүндө иштеп жатып төмөнкү тапшырмага туш болдум: "id" жана "упай" тилкелери бар SQL таблицасын "колдонуучу" алып, "упай" боюнча иреттелген бардык колдонуучулардын рейтинг тизмесин аныктап, анда бирдей упайга ээ колдонуучулар бирдей рейтингге ээ болушат. Колдонуучу аныктаган өзгөрмөлөрдү колдонуу менен бул милдетти интуитивдик жана оңой чечсе болот.


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   |
+--------+-----------+----------+
Артка