创建测试表和数据
postgres=# create table test(n int);
CREATE TABLE
postgres=# insert into test(n) values (1);
INSERT 0 1
postgres=# insert into test(n) values (1);
INSERT 0 1
postgres=# insert into test(n) values (2);
INSERT 0 1
postgres=# insert into test(n) values (3);
INSERT 0 1
postgres=# insert into test(n) values (4);
INSERT 0 1
postgres=# insert into test(n) values (5);
INSERT 0 1
postgres=#
rank() 和 row_number()
有order by
postgres=# select n, rank() over(order by n asc), row_number() over(order by n asc) from test;
n | rank | row_number
---+------+------------
1 | 1 | 1
1 | 1 | 2
2 | 3 | 3
3 | 4 | 4
4 | 5 | 5
5 | 6 | 6
(6 rows)
postgres=#
不加order by
postgres=# select n, rank() over(), row_number() over() from test;
n | rank | row_number
---+------+------------
1 | 1 | 1
1 | 1 | 2
2 | 1 | 3
3 | 1 | 4
4 | 1 | 5
5 | 1 | 6
(6 rows)
postgres=#
总结
- rank():排名函数,相同的排名,rank()的值是相同的,然后到间隔数值到下一名.(比如上面例子中的n,假设是分数,即1,1的排名是相同,都是第一名,2就是就三名了)
- row_number():含义是行号,它是按出现的顺序来显示的(比如上面的例子,说法是1,2,3这样子下去)
- rank()的结果,是依赖于窗口中的over()这部分,这部分不同,会导致rank()的结果也不同。
参考资料
PostgreSQL tutorial-window
PostgreSQL 窗口函数