தரவரிசை பட்டியலைத் தீர்மானிக்க SQL வினவல்

இன்று நான் வாடிக்கையாளர் திட்டப்பணியில் பணிபுரியும் போது பின்வரும் பணியைச் சந்தித்தேன்: "ஐடி" மற்றும் "ஸ்கோர்" நெடுவரிசைகளுடன் கூடிய SQL அட்டவணை "பயனர்" ஒன்றை எடுத்து, "ஸ்கோர்" அடிப்படையில் வரிசைப்படுத்தப்பட்ட அனைத்து பயனர்களின் தரவரிசைப் பட்டியலைத் தீர்மானிக்கவும். பயனர் வரையறுக்கப்பட்ட மாறிகளைப் பயன்படுத்துவதன் மூலம், இந்தப் பணியை உள்ளுணர்வாகவும் எளிதாகவும் தீர்க்க முடியும்.


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   |
+--------+-----------+----------+
மீண்டும்