SQL語句中的rank () over , row_number() over ,rank_dense ()

總結如下:
我創建了一個表,數據如下,
SQL> select * from test;
       A1       A2
---------- ----------
      1       3
      2       4
      3       2
      3       5
      4       2
然后用rank () over,
SQL> select a1,a2,rank () over (order by a1) rank from test;
       A1       A2    RANK
---------- ---------- ----------
      1       3       1
      2       4       2
      3       2       3
      3       5       3
      4       2       5
SQL> select a1,a2,rank () over (order by a2) rank from test;
       A1       A2    RANK
---------- ---------- ----------
      3       2       1
      4       2       1
      1       3       3
      2       4       4
      3       5       5
原來這個就是用來看排名的東東啊。
接下來看看row_number() over,
SQL> select a1,a2, row_number () over (order by a1) rank from test;
       A1       A2    RANK
---------- ---------- ----------
      1       3       1
      2       4       2
      3       2       3
      3       5       4
      4       2       5
SQL> select a1,a2, row_number () over (order by a2) rank from test;
       A1       A2    RANK
---------- ---------- ----------
      3       2       1
      4       2       2
      1       3       3
      2       4       4
      3       5       5
再看看dense_rank () over
SQL> select a1,a2, dense_rank () over (order by a1) rank from test;
       A1       A2    RANK
---------- ---------- ----------
      1       3       1
      2       4       2
      3       2       3
      3       5       3
      4       2       4
dense_rank在有出現相同的rank后,rank的值是緊接上一次的rank值。
可以這么理解,我們通常意義上的top N 的實現應該采用row_number() over 而不是rank () over,因為row_number 是給記錄加一個序號標記,而rank 是相當于進行排序后的排名,也就是如果排序列是相同的,那么他們的返回值也是相同的,而row_number則不可能返回相同值。
放到一起看看吧:

SQL>
1select a1,a2,
2rank () over (order by a1) rank,
3dense_rank () over (order by a1) dense_rank,
4row_number () over (order by a1) row_number
5from test;
       A1       A2    RANK DENSE_RANK ROW_NUMBER
---------- ---------- ---------- ---------- ----------
      1       3       1       1       1
      2       4       2       2       2
      3       2       3       3       3
      3       5       3       3       4
      4       2       5       4       5
row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序).
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內).
dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重復值的.