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