Heute bin ich bei der Arbeit an einem Kundenprojekt auf folgende Aufgabe gestoßen: Man nehme eine SQL-Tabelle "user" mit den Spalten "id" und "score" und ermittle eine anhand "score" sortierte Rangliste aller Benutzer, in der Benutzer mit der gleichen Punktzahl dasselbe Ranking bekommen. Durch den Einsatz von benutzerdefinierten Variablen kann man diese Aufgabe intuitiv und einfach lösen.
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)
Durch die Verwendung von zwei Variablen wird dies einfach gelöst
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
und man erhält die gewünschte Ausgabe
+--------+-----------+----------+ | *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 | +--------+-----------+----------+