Ερώτημα SQL για τον προσδιορισμό μιας λίστας κατάταξης

Σήμερα συνάντησα την ακόλουθη εργασία ενώ εργαζόμουν σε ένα έργο πελάτη: Πάρτε έναν πίνακα SQL "user" με τις στήλες "id" και "score" και καθορίστε μια λίστα κατάταξης όλων των χρηστών, ταξινομημένη βάσει "score", στην οποία οι χρήστες με την ίδια βαθμολογία λαμβάνουν την ίδια κατάταξη. Με τη χρήση μεταβλητών που ορίζονται από το χρήστη, αυτή η εργασία μπορεί να λυθεί διαισθητικά και εύκολα.


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)

Η χρήση δύο μεταβλητών λύνει αυτό απλά:

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

και παίρνετε την έξοδο που θέλετε:

+--------+-----------+----------+
|  *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   |
+--------+-----------+----------+
Πίσω