如何在PostgreSQL中实现考虑并列的跳号行排名?
在PostgreSQL中生成跳号并列排名序列
需求:查询时生成并列同序、后续跳号的排名序列(形如1 1 3 4 5 5 7…),当sum_all列值相同时,排名序号相同,后续序号跳过已占用的位次。
示例表创建语句
create table test(name,sum_all)as values ('a',100) ,('b',95) ,('c',100) ,('d',75) ,('e',55);
期望查询结果
| name | sum_all | order_number |
|---|---|---|
| a | 100 | 1 |
| c | 100 | 1 |
| b | 95 | 3 |
| d | 75 | 4 |
| e | 55 | 5 |
解决方案
直接使用PostgreSQL内置的RANK()窗口函数即可实现该需求,该函数会为相同值的行分配相同排名,同时跳过已被占用的位次。
查询语句如下:
SELECT name, sum_all, RANK() OVER (ORDER BY sum_all DESC) AS order_number FROM test ORDER BY sum_all DESC, name;
说明
RANK() OVER (ORDER BY sum_all DESC):按sum_all降序排列,为相同sum_all的行分配相同排名,后续行的排名会跳过并列占用的位次(比如两个100占了第1位,下一行直接排第3)。- 最后外层的
ORDER BY sum_all DESC, name是为了让结果和示例顺序一致,可根据实际需求调整排序规则。
内容的提问来源于stack exchange,提问作者momoman
相关产品推荐
相关产品推荐

