在ITPUB上,看到BITI这么说:
关于 rank() over 与 row_number() over
刚才在 电子杂志中看见了利用rank实现top n
偶只想提醒一点:
我们通常意义上的top N 的实现应该采用row_number() over 而不是rank
因为row_number 是给记录加一个序号标记
而rank是相当于进行排序后的排名,也就是如果排序列是相同的,那么他们的返回值也是相同的,而row_number则不可能返回相同值
SQL> select * from test;
A
----------
1
2
1
SQL> select a,rank() over(order by a) from test;
A RANK()OVER(ORDERBYA)
---------- --------------------
1 1
1 1
2 3
SQL> select a,row_number() over(order by a) from test;
A ROW_NUMBER()OVER(ORDERBYA)
---------- --------------------------
1 1
1 2
2 3
偶只想提醒一点:
我们通常意义上的top N 的实现应该采用row_number() over 而不是rank
因为row_number 是给记录加一个序号标记
而rank是相当于进行排序后的排名,也就是如果排序列是相同的,那么他们的返回值也是相同的,而row_number则不可能返回相同值
SQL> select * from test;
A
----------
1
2
1
SQL> select a,rank() over(order by a) from test;
A RANK()OVER(ORDERBYA)
---------- --------------------
1 1
1 1
2 3
SQL> select a,row_number() over(order by a) from test;
A ROW_NUMBER()OVER(ORDERBYA)
---------- --------------------------
1 1
1 2
2 3