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> select a1,a2,
2 rank () over (order by a1) rank,
3 dense_rank () over (order by a1) dense_rank,
4 row_number () over (order by a1) row_number
5 from 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是沒有重複值的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-664215/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- row_number() over,rank() over,dense_rank() over的區別
- lead lag rank()over()dense_rank()row_number()over()rollupcube幾大分析函式函式
- sql中row_number over語句SQL
- mysql自動排序函式dense_rank() over()、rank() over()、row_num() over()用法和區別MySql排序函式
- row_number() over函式函式
- ROW_NUMBER() OVER() 分析函式的用法函式
- ROW_NUMBER() OVER函式的基本用法函式
- 理解了row_number()over (partition by order by )的方法
- Oracle 中分析函式用法之--rank(),dense_rank(),partition,over()Oracle函式
- SqlServer 分頁 ROW_NUMBER() OVER(Order by * DESC ) AS RowNumberSQLServer
- Oracle 中的 ROW_NUMBER() OVER() 分析函式的用法Oracle函式
- row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
- SQL-ROWNUMBER-OVER彙總SQL
- SQL SERVER 排序函式ROW_NUMBER、RANK、DENSE_RANK、NTILESQLServer排序函式
- sum()over()和count()over()分析函式函式
- Flink SQL之Over 聚合操作SQL
- over (partition by)
- Import OverImport
- 巧用row_number() over()函式,選取重複記錄中想要的值函式
- MYSQL-實現ORACLE- row_number() over(partition by ) 分組排序功能.MySqlOracle排序
- rank,dense_rank,row_number 分析函式函式
- Oracle:Rank,Dense_Rank,Row_Number比較Oracle
- Hive中row_number()、dense_rank()、rank()的區別Hive
- sql語句中as的用法SQL
- 語法:OVER(PARTITION BY)及開窗函式函式
- 分析函式 over函式
- sqlserver2005資料庫映象 的switch over 和fail overSQLServer資料庫AI
- oracle分析函式Rank, Dense_rank, row_numberOracle函式
- 請問一下在hibernate中有沒有像在oracle中的row_number() OVER()這種語法的?Oracle
- oracle下資料的排序分組row_number() over()--分析函式,可用於去重Oracle排序函式
- sql語句中JOIN ON 的使用SQL
- 分析函式rank() row_number函式
- 分析函式中rank(),row_number(),dense_rank()的區別函式
- 分析函式——排序排列(rank、dense_rank、row_number)函式排序
- oracle 分析函式之(rank()/dense_rank()/row_number())Oracle函式
- OVER(PARTITION BY)函式用法函式
- Oracle RDBMS History Over the YearsOracle
- Rsync over SSH with No Password (Crontab)