Kërkesa SQL për të përcaktuar një listë të rangut

Sot kam hasur në detyrën e mëposhtme gjatë punës për një projekt klienti: Merrni një tabelë SQL "user" me kolonat "id" dhe "score" dhe përcaktoni një listë renditjeje të të gjithë përdoruesve, të renditur në bazë të "score", në të cilën përdoruesit me të njëjtin rezultat marrin të njëjtën renditje. Duke përdorur variabla të përcaktuara nga përdoruesi, kjo detyrë mund të zgjidhet në mënyrë intuitive dhe lehtësisht.


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)

Përdorimi i dy ndryshoreve e zgjidh këtë thjesht:

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

dhe ju merrni prodhimin që dëshironi:

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