创建测试表和数据

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=#

总结

  1. rank():排名函数,相同的排名,rank()的值是相同的,然后到间隔数值到下一名.(比如上面例子中的n,假设是分数,即1,1的排名是相同,都是第一名,2就是就三名了)
  2. row_number():含义是行号,它是按出现的顺序来显示的(比如上面的例子,说法是1,2,3这样子下去)
  3. rank()的结果,是依赖于窗口中的over()这部分,这部分不同,会导致rank()的结果也不同。

参考资料

  1. PostgreSQL tutorial-window

  2. PostgreSQL 窗口函数