Рейтинг тизмесин аныктоо үчүн 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   |
+--------+-----------+----------+
Артка