Oracle rank和dense_rank排名函数

1.rank函数

rank计算一组值的排名,返回数字类型。排名可能是不连续。如果有5人,其中有2个人排名第一,则rank返回的排名结果为:1 1 3 4 5。

  • 作为一个聚合函数,返回虚拟行在样表中的排名。
  • 作为一个解析函数,返回每一个的排名。

1.1聚合函数语法

1.2解析函数语法

1.3聚合函数的例子

计算假定薪水为2000的员工在样表中的排名。

SQL> select rank(2000) within group(order by e.sal desc) "Rank"
  2    from emp e;
 
      Rank
----------
         7

假定薪水为2000的员工,按照薪水从高到低在样表中排第7名。

1.4解析函数的例子

按照薪水从高到低进行排名:

SQL> select e.ename, e.sal, rank() over(order by e.sal desc) "Rank" from emp e;
 
ENAME            SAL       Rank
---------- --------- ----------
KING         5000.00          1
FORD         3000.00          2
SCOTT        3000.00          2

JONES        2975.00          4
BLAKE        2850.00          5
CLARK        2450.00          6
ALLEN        1600.00          7
TURNER       1500.00          8
MILLER       1300.00          9
WARD         1250.00         10
MARTIN       1250.00         10

ADAMS        1100.00         12
JAMES         950.00         13
SMITH         800.00         14

薪水为3000重复,并列排名第2,跳过第3.

在部内进行薪水从高到低的排名:

SQL> select e.ename,
  2         e.sal,
  3         e.deptno,
  4         rank() over(partition by e.deptno order by e.sal desc) "Rank"
  5    from emp e;
 
ENAME            SAL DEPTNO       Rank
---------- --------- ------ ----------
KING         5000.00     10          1
CLARK        2450.00     10          2
MILLER       1300.00     10          3
SCOTT        3000.00     20          1
FORD         3000.00     20          1
JONES        2975.00     20          3
ADAMS        1100.00     20          4
SMITH         800.00     20          5
BLAKE        2850.00     30          1
ALLEN        1600.00     30          2
TURNER       1500.00     30          3
MARTIN       1250.00     30          4
WARD         1250.00     30          4
JAMES         950.00     30          6

2.dense_rank函数

dense_rank计算一组值的排名,该排名是连续整数从1开始。如果有5人,其中有2个人排名第一,则rank返回的排名结果为:1 1 2 3 4。

  • 作为一个聚合函数,返回虚拟行在样表中的排名。
  • 作为一个解析函数,返回每一个的排名。

2.1聚合函数语法

2.2解析函数语法

2.3聚合函数的例子

计算假定薪水为2000的员工在样表中的排名。

SQL> select dense_rank(2000) within group(order by e.sal desc) "Rank"
  2    from emp e;
 
      Rank
----------
         6

假定薪水为2000的员工,按照薪水从高到低在样表中排第7名。

2.4解析函数的例子

按照薪水从高到低进行排名:

SQL> select e.ename,
  2         e.sal,
  3         dense_rank() over(order by e.sal desc) "Rank"
  4    from emp e;
 
ENAME            SAL       Rank
---------- --------- ----------
KING         5000.00          1
FORD         3000.00          2
SCOTT        3000.00          2
JONES        2975.00          3

BLAKE        2850.00          4
CLARK        2450.00          5
ALLEN        1600.00          6
TURNER       1500.00          7
MILLER       1300.00          8
WARD         1250.00          9
MARTIN       1250.00          9
ADAMS        1100.00         10

JAMES         950.00         11
SMITH         800.00         12

有两个1250并列排名第8,接着1100是第9。排名是连续是连续的。

在部内进行薪水从高到低的排名:

SQL> select e.ename,
  2         e.sal,
  3         e.deptno,
  4         dense_rank() over(partition by e.deptno order by e.sal desc) "Rank"
  5    from emp e;
 
ENAME            SAL DEPTNO       Rank
---------- --------- ------ ----------
KING         5000.00     10          1
CLARK        2450.00     10          2
MILLER       1300.00     10          3
SCOTT        3000.00     20          1
FORD         3000.00     20          1
JONES        2975.00     20          2
ADAMS        1100.00     20          3

SMITH         800.00     20          4
BLAKE        2850.00     30          1
ALLEN        1600.00     30          2
TURNER       1500.00     30          3
MARTIN       1250.00     30          4
WARD         1250.00     30          4
JAMES         950.00     30          5

20部门有两个3000并列排名第一,接着2975是第二。排名是连续是连续的。

原文地址:https://www.cnblogs.com/riasky/p/3468875.html