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

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


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