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

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


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