Truy vấn SQL để xác định danh sách xếp hạng

Hôm nay, tôi đã bắt gặp nhiệm vụ sau khi làm việc trong một dự án khách hàng: Lấy một bảng SQL "người dùng" với các cột "id" và "điểm" và xác định xếp hạng của tất cả người dùng dựa trên "điểm" trong đó người dùng có cùng xếp hạng với cùng số điểm. Nhiệm vụ này có thể được giải quyết một cách trực quan và dễ dàng bằng cách sử dụng các biến do người dùng xác định .


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)

Sử dụng hai biến giải quyết điều này một cách đơn giản

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

và bạn nhận được đầu ra bạn muốn

+--------+-----------+----------+
|  *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   |
+--------+-----------+----------+
Trở lại