SQL-forespørgsel for at bestemme en rangliste

I dag stødte jeg på følgende opgave, mens jeg arbejdede på et kundeprojekt: Tag en SQL-tabel "bruger" med kolonnerne "id" og "score" og bestem en rangliste over alle brugere sorteret efter "score", hvor brugere med få den samme placering med samme score. Denne opgave kan løses intuitivt og let ved hjælp af brugerdefinerede variabler .


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)

Brug af to variabler løser dette enkelt

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

og du får det output, du ønsker

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