Consulta SQL para determinar una lista de clasificación

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   |
+--------+-----------+----------+
Atrás