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