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

MySQL排名异常:所有gym_id排名均为1,需实现带并列的排名

MySQL实现带并列的健身房总分排名

你当前的查询问题出在PARTITION BY scores.gym_id子句上——它会把每个健身房单独划分为一个分组,每个分组内只有该健身房的记录,所以每个分组的排名自然都是1,完全达不到跨健身房排名的目的。

要实现你想要的带并列的排名(比如1、2、3、4、4、6、7这种形式),直接用MySQL的RANK()窗口函数,去掉错误的分区条件即可:

SELECT 
    gym_id,
    RANK() OVER (ORDER BY total_points DESC) AS ranking
FROM scores;

关键说明:

  • 移除PARTITION BY gym_id:让所有健身房的记录处于同一个排名分组中
  • ORDER BY total_points DESC:按总分从高到低排序,确保得分高的健身房排名靠前(如果需要升序排名可去掉DESC)
  • RANK()函数特性:当多个健身房总分相同时,会赋予相同排名,后续不同总分的记录会跳过并列的名次(比如两个第4名后,下一个就是第6名)

如果需要不跳过并列名次的排名(比如两个第4名后下一个是第5名),可以替换成DENSE_RANK()函数:

SELECT 
    gym_id,
    DENSE_RANK() OVER (ORDER BY total_points DESC) AS ranking
FROM scores;

特殊情况处理:

如果同一个gym_id对应多条记录(比如健身房有多个参赛组别),需要先聚合该健身房的总得分再排名:

SELECT 
    gym_id,
    SUM(total_points) AS total_score,
    RANK() OVER (ORDER BY SUM(total_points) DESC) AS ranking
FROM scores
GROUP BY gym_id;

内容的提问来源于stack exchange,提问作者A.M. Bookdragon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:15:01