র‌্যাঙ্কিং তালিকা নির্ধারণের জন্য এসকিউএল কোয়েরি

আজ আমি গ্রাহক প্রকল্পে কাজ করার সময় নীচের কাজটি পেরিয়ে এসেছি: কলামগুলি "আইডি" এবং "স্কোর" সহ একটি এসকিউএল টেবিল "ব্যবহারকারী" নিন এবং "স্কোর" অনুসারে বাছাই করা সমস্ত ব্যবহারকারীর একটি র‌্যাঙ্কিং তালিকা নির্ধারণ করুন যার সাথে ব্যবহারকারীরা একই স্কোর সহ একই র‌্যাঙ্কিং পান। এই কার্যটি ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলগুলি ব্যবহার করে স্বজ্ঞাত এবং সহজেই সমাধান করা যেতে পারে।


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   |
+--------+-----------+----------+
পেছনে