پرس و جو SQL برای تعیین لیست رتبه بندی

امروز در حین کار بر روی یک پروژه مشتری با کار زیر روبرو شدم: یک جدول SQL "user" با ستون های "id" و "score" را انتخاب کنید و لیست رتبه بندی همه کاربران را مشخص کنید که بر اساس "امتیاز" مرتب شده اند، که در آن کاربران با امتیاز یکسان رتبه بندی یکسانی را کسب می کنند. با استفاده از متغیرهای تعریف شده توسط کاربر، این کار را می توان به طور مستقیم و آسان حل کرد.


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   |
+--------+-----------+----------+
بازگشت