SQL中RANK() OVER多条件排序:相同成绩按玩家姓名字母序排名
SQL多条件排名查询修改方案
问题原因
你当前的写法存在两个核心问题:
- 仅在窗口函数
RANK()的排序规则中指定了成绩降序,没有补充最终结果的全局排序规则,数据库返回结果的顺序是不固定的,窗口函数的排序逻辑不会直接决定最终输出的行顺序。 - 使用了隐式内连接(在
WHERE中写表关联条件)的旧语法,可读性差且容易出错。
解决方案
根据你的需求分两种场景实现:
场景1:同成绩玩家排名位次相同,同排名的结果按姓名升序展示
这是绝大多数排名场景的需求,同分数的玩家排名一致,仅展示时按名字顺序排列:
SELECT RANK() OVER(ORDER BY MAX(result) DESC) AS rank, name, MAX(result) AS max_score FROM Results INNER JOIN Players ON Results.player_id = Players.id GROUP BY name ORDER BY max_score DESC, name ASC;
场景2:同成绩玩家按姓名升序区分排名,名字越靠前排名越高
如果要求同成绩的玩家排名不重复,按姓名顺序决定排名先后,可以把姓名排序规则加到窗口函数的排序逻辑中:
SELECT ROW_NUMBER() OVER(ORDER BY MAX(result) DESC, name ASC) AS rank, name, MAX(result) AS max_score FROM Results INNER JOIN Players ON Results.player_id = Players.id GROUP BY name;
额外优化建议
如果存在同名玩家的情况,建议分组时同时按玩家ID和姓名分组,避免不同玩家重名导致的统计错误:GROUP BY Players.id, Players.name
内容的提问来源于stack exchange,提问作者AATU
相关产品推荐
相关产品推荐

