MySQL查询包含并列重复值的前N个最高值的实现方法
MySQL并列排名前3记录查询方案
要实现带并列保留的前3排名查询,核心是按分数档位排名而非按数据行排名,同分数会被划分到同一个排名档位,所有符合前3档位的记录都会被返回,以下是两种常用实现方式:
方案1:MySQL 8.0及以上版本(支持窗口函数)
使用DENSE_RANK()窗口函数实现,该函数特性为并列排名不会跳号,完全匹配需求:
WITH ranked_scores AS ( SELECT Names, Marks, DENSE_RANK() OVER (ORDER BY Marks DESC) AS rank_num FROM 替换为你的实际表名 ) SELECT Names, Marks FROM ranked_scores WHERE rank_num <= 3 ORDER BY Marks DESC;
逻辑说明:示例数据中60分排名第1、55分排名第2、50分排名第3、20分排名第4,筛选rank_num<=3即可得到所有符合要求的记录,并列分数自动全部保留。
方案2:MySQL 5.x及更低版本(不支持窗口函数)
通过子查询统计高位不同分数数量实现:
SELECT t1.Names, t1.Marks FROM 替换为你的实际表名 t1 WHERE (SELECT COUNT(DISTINCT t2.Marks) FROM 替换为你的实际表名 t2 WHERE t2.Marks > t1.Marks) < 3 ORDER BY t1.Marks DESC;
逻辑说明:统计比当前记录分数更高的不同分数的数量,小于3即代表当前分数属于前3个档位,自然包含所有并列记录。
内容的提问来源于stack exchange,提问作者Gops61
相关产品推荐
相关产品推荐

