You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:36:03