SQL-fråga för att bestämma en rankinglista

Idag stötte jag på följande uppgift när jag arbetade med ett kundprojekt: Ta en SQL-tabell "användare" med kolumnerna "id" och "poäng" och bestäm en rankinglista över alla användare, sorterad utifrån "poäng", där användare med samma poäng får samma ranking. Genom att använda användardefinierade variabler kan denna uppgift lösas intuitivt och enkelt.


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)

Att använda två variabler löser detta 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

och du får den effekt du vill ha:

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