Oracle數(shù)據(jù)庫中Rank等函數(shù)的比較與選擇
Oracle數(shù)據(jù)庫中Rank,Dense_Rank,Row_Number函數(shù)有什么樣的區(qū)別呢?在實際的應(yīng)用中我們又該如何去選擇呢?本文結(jié)合實例說明了這些。
首先我們先創(chuàng)建一個員工信息表,在查詢分析器中執(zhí)行以下的代碼:
- Create Table EmployeeInfo (CODE Number(3) Not Null,EmployeeName varchar2(15),DepartmentID Number(3),Salary NUMBER(7,2),
- Constraint PK_EmployeeInfo Primary Key (CODE));
創(chuàng)建完成后,在企業(yè)管理其中打開表,錄入一些信息,為了讓大家清楚錄入的內(nèi)容,錄入完畢后我執(zhí)行了查詢語句Select * From EMPLOYEEINFO;將員工信息表的內(nèi)容入下圖所示:
現(xiàn)執(zhí)行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
結(jié)果如下:
說明:Rank,Dense_rank,Row_number函數(shù)為每條記錄產(chǎn)生一個從1開始至N的自然數(shù),N的值可能小于等于記錄的總數(shù)。這3個函數(shù)的唯一區(qū)別在于當(dāng)碰到相同數(shù)據(jù)時的排名策略。
①ROW_NUMBER:
Row_number函數(shù)返回一個唯一的值,當(dāng)碰到相同數(shù)據(jù)時,排名按照記錄集中記錄的順序依次遞增。
②DENSE_RANK:
Dense_rank函數(shù)返回一個唯一的值,除非當(dāng)碰到相同數(shù)據(jù)時,此時所有相同數(shù)據(jù)的排名都是一樣的。
③RANK:
Rank函數(shù)返回一個唯一的值,除非遇到相同的數(shù)據(jù)時,此時所有相同數(shù)據(jù)的排名是一樣的,同時會在***一條相同記錄和下一條不同記錄的排名之間空出排名。
同時也可以分組排序,也就是在Over從句內(nèi)加入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
結(jié)果如下:
現(xiàn)在如果插入一條工資為空的記錄,那么執(zhí)行上述語句,結(jié)果如下:
會發(fā)現(xiàn)空值的竟然排在了***位,這顯然不是想要的結(jié)果。解決的辦法是在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
結(jié)果如下:
本文就介紹到這里,如果您想了解更多關(guān)于Oracle的內(nèi)容,可以到我們網(wǎng)站的Oracle頻道:http://database.51cto.com/oracle/,謝謝大家的支持!
【編輯推薦】