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 rankningslista över alla användare sorterade efter "poäng" där användare med få samma ranking med samma poäng. Denna uppgift kan lösas intuitivt och enkelt med användardefinierade 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)

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