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

Sot kam hasur në detyrën e mëposhtme ndërsa po punoja për një projekt të klientit: Merrni një tryezë SQL "përdorues" me kolonat "id" dhe "pikë" dhe përcaktoni një renditje të të gjithë përdoruesve bazuar në "rezultatin" në të cilin përdoruesit me merrni të njëjtën renditje me të njëjtën rezultat. Kjo detyrë mund të zgjidhet në mënyrë intuitive dhe të lehtë duke përdorur variablat e përcaktuar nga përdoruesi .


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