Rank,Dense_rank,Row_number

Rank,Dense_rank,Row_number函数为每条记录产生一个从1开始至N的自然数,N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略。

①ROW_NUMBER:

Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。

②DENSE_RANK:

Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。

③RANK:

Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。

  

  SALARY ROW_NUMBER DENSE_RANK RANK
1 2006 1 1 1
2 2008 2 2 2
3 2008 3 2 2
4 2008 4 2 2
5 2009 5 3 5
6 2009 6 3 5
7 2009 7 3 5
8 2010 8 4 8
9 2011 9 5 9

 

同时也可以分组排序,也就是在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

 

Oracle的排序策略默认NULL最大,如果想在降序排列中,使空值显示在最后边,可以在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

 

 

你可能感兴趣的:(row_number)