Interogare SQL pentru a determina o listă de clasare

Astăzi am dat peste următoarea sarcină în timp ce lucram la un proiect client: Luați un tabel SQL „user” cu coloanele „id” și „score” și stabiliți o listă de clasare a tuturor utilizatorilor, sortată în funcție de „score”, în care utilizatorii cu același scor obțin același clasament. Prin utilizarea variabilelor definite de utilizator, această sarcină poate fi rezolvată intuitiv și ușor.


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)

Utilizarea a două variabile rezolvă acest lucru simplu:

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

și veți obține rezultatul dorit:

+--------+-----------+----------+
|  *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   |
+--------+-----------+----------+
Înapoi