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

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


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