Vandaag kwam ik tijdens het werken aan een klantproject de volgende taak tegen: Neem een SQL-tabel "user" met de kolommen "id" en "score" en bepaal een ranglijst van alle gebruikers, gesorteerd op basis van "score", waarin gebruikers met dezelfde score dezelfde rangschikking krijgen. Door door de gebruiker gedefinieerde variabelen te gebruiken, kan deze taak intuïtief en eenvoudig worden opgelost.
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)
Het gebruik van twee variabelen lost dit eenvoudig op:
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
en je krijgt de output die je wilt:
+--------+-----------+----------+ | *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 | +--------+-----------+----------+