Oracle:Rank,Dense_Rank,Row_Number比較
引用
trailblizer 的 Oracle:Rank,Dense_Rank,Row_Number比較
Oracle:Rank,Dense_Rank,Row_Number比較
一個員工資訊表
Create Table EmployeeInfo (CODE Number(3) Not Null,EmployeeName varchar2(15),DepartmentID Number(3),Salary NUMBER(7,2),
Constraint PK_EmployeeInfo Primary Key (CODE));
Select * From EMPLOYEEINFO
現執行SQL語句:
Select EMPLOYEENAME,SALARY,
RANK() OVER (Order By SALARY Desc) "RANK",
DENSE_RANK() OVER (Order By SALARY Desc ) "DENSE_RANK",
ROW_NUMBER() OVER(Order By SALARY Desc) "ROW_NUMBER"
From EMPLOYEEINFO
結果如下:
Rank,Dense_rank,Row_number函式為每條記錄產生一個從1開始至N的自然數,N的值可能小於等於記錄的總數。這3個函式的唯一區別在於當碰到相同資料時的排名策略。
①ROW_NUMBER:
Row_number函式返回一個唯一的值,當碰到相同資料時,排名按照記錄集中記錄的順序依次遞增。
②DENSE_RANK:
Dense_rank函式返回一個唯一的值,除非當碰到相同資料時,此時所有相同資料的排名都是一樣的。
③RANK:
Rank函式返回一個唯一的值,除非遇到相同的資料時,此時所有相同資料的排名是一樣的,同時會在最後一條相同記錄和下一條不同記錄的排名之間空出排名。
同時也可以分組排序,也就是在Over從句內加入Partition by groupField:
Select DEPARTMENTID,EMPLOYEENAME,SALARY,
RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc) "RANK",
DENSE_RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc ) "DENSE_RANK",
ROW_NUMBER() OVER( Partition By DEPARTMENTID Order By SALARY Desc) "ROW_NUMBER"
From EMPLOYEEINFO
結果如下:
現在如果插入一條工資為空的記錄,那麼執行上述語句,結果如下:
會發現空值的竟然排在了第一位,這顯然不是想要的結果。解決的辦法是在Over從句Order By後加上 NULLS Last即:
Select EMPLOYEENAME,SALARY,
RANK() OVER (Order By SALARY Desc Nulls Last) "RANK",
DENSE_RANK() OVER (Order By SALARY Desc Nulls Last) "DENSE_RANK",
ROW_NUMBER() OVER(Order By SALARY Desc Nulls Last ) "ROW_NUMBER"
From EMPLOYEEINFO
結果如下:
http://diwuningning.blog.163.com/blog/static/3426519520102252934792/
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9382/viewspace-1035023/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hive ROW_NUMBER,RANK(),DENSE_RANK()Hive
- Hive中row_number()、dense_rank()、rank()的區別Hive
- 7.78 DENSE_RANK
- Oracle vs PostgreSQL Develop(14) - 分析函式KEEP DENSE_RANKOracleSQLdev函式
- mysql自動排序函式dense_rank() over()、rank() over()、row_num() over()用法和區別MySql排序函式
- Oracle date 型別比較和String比較Oracle型別
- Oracle中rownum和row_number()Oracle
- ROW_NUMBER 開窗函式最佳化方案(Oracle && PostgreSQL 效能比對)函式OracleSQL
- DB2常用函式與Oracle比較TIDB2函式Oracle
- js 深比較和淺比較JS
- Oracle vs PostgreSQL,研發注意事項(8)- Oracle資料比較規則OracleSQL
- rank
- 字串比較字串
- Integer比較
- 比較集合
- 效能比較
- 相容oracle的edit_distance_similarity 比較兩個字串相似度OracleMILA字串
- Go和Python比較的話,哪個比較好?GoPython
- 比較檔案是否相同,(比較MD5值)
- [C++] 自定義C++比較器比較大小C++
- 數字比較
- PHP比較字串PHP字串
- 常用 NoSQL 比較SQL
- 列舉比較
- Jsonunit 比較jsondiffJSON
- easyExcel & poi 比較Excel
- Integer的比較
- CORS/JSONP比較CORSJSON
- ==與equals比較
- 主流CRM比較
- Java 比較器Java
- Oracle與PostgreSQL比較:PostgreSQL至少在安裝和大小方面擊敗了Oracle - foersterOracleSQL
- PaddleSeg2.8訓練驗證時報錯[Hint: Expected axis >= -rank && axis < rank == true, but received axis >= -rank && axis < rank:0 != true:1.]
- TCP和UDP比較TCPUDP
- Hibernate與mybatis比較MyBatis
- forEach、map、reduce比較
- VUE中diff比較Vue
- yarn 與 npm 比較YarnNPM
- java比較日期大小Java