Hoy me encontré con la siguiente tarea mientras trabajaba en el proyecto de un cliente: tomar una tabla SQL "usuario" con las columnas "id" y "puntuación" y determinar una lista de clasificación de todos los usuarios, ordenados según la "puntuación", en la que los usuarios con la misma puntuación obtienen la misma clasificación. Al utilizar variables definidas por el usuario, esta tarea se puede resolver de forma intuitiva y sencilla.
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)
El uso de dos variables resuelve esto simplemente:
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
y obtienes el resultado que deseas:
+--------+-----------+----------+ | *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 | +--------+-----------+----------+