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
相关产品推荐
相关产品推荐

