PostgreSQL排名问题求助:同分运动员需赋予相同名次
PostgreSQL 同得分同名次实现方案
在PostgreSQL里,直接用窗口函数就能轻松实现同得分同名次的需求,不用写复杂的IF函数或者自定义统计逻辑,推荐用RANK()或DENSE_RANK():
1. 使用 RANK() 函数
RANK()会为相同得分分配相同名次,后续不同得分的名次会跳过中间空缺的位置(比如两个第2名,下一个得分的名次是第4名):
SELECT Name, Points, -- 按得分降序排名,得分高的名次靠前 RANK() OVER (ORDER BY Points DESC) AS 名次 FROM 你的表名;
2. 使用 DENSE_RANK() 函数
如果需要名次连续不空缺(两个第2名之后直接是第3名),用DENSE_RANK():
SELECT Name, Points, DENSE_RANK() OVER (ORDER BY Points DESC) AS 名次 FROM 你的表名;
把上述SQL里的你的表名替换成实际表名即可,这两个窗口函数是PostgreSQL处理排名场景的标准方法,比自定义函数更高效且易维护。
内容的提问来源于stack exchange,提问作者ob1vank
相关产品推荐
相关产品推荐

