mysql 查询排名,包括并列排名和连续排名
在MySQL中,可以使用变量来模拟窗口函数(ROW\_NUMBER)实现排名功能。以下是一个示例代码,展示如何实现并列排名和连续排名:
-- 创建示例表和数据
CREATE TABLE rank_example (
id INT AUTO_INCREMENT PRIMARY KEY,
score DECIMAL(10, 2) NOT NULL
);
INSERT INTO rank_example (score) VALUES (85.5);
INSERT INTO rank_example (score) VALUES (85.5);
INSERT INTO rank_example (score) VALUES (80.0);
INSERT INTO rank_example (score) VALUES (79.5);
INSERT INTO rank_example (score) VALUES (79.5);
INSERT INTO rank_example (score) VALUES (75.0);
-- 并列排名
SET @prev_score = NULL;
SET @rank = 0;
SELECT
id,
score,
CASE
WHEN @prev_score = score THEN @rank
WHEN @prev_score := score THEN @rank := @rank + 1
END AS rank
FROM
rank_example
ORDER BY
score DESC;
-- 连续排名
SET @prev_score = NULL;
SET @rank = 0;
SET @consecutive_rank = 0;
SELECT
id,
score,
CASE
WHEN @prev_score = score THEN @consecutive_rank
WHEN @prev_score := score THEN @rank := @rank + 1 AND @consecutive_rank := @rank
END AS rank
FROM
rank_example
ORDER BY
score DESC;
第一个查询实现了并列排名,即使得有相同分数的行获得相同的排名。
第二个查询实现了连续排名,即排名不会跳跃,即使分数之间可能有断层(例如,如果有75分、79分、且没有77分,则79分的排名将是3,而不是2)。
请注意,这些查询需要在MySQL 8.0或更新版本中使用,因为在旧版本中需要使用更复杂的方法来模拟窗口函数。
评论已关闭