加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle rank和dense_rank排名函数

发布时间:2020-12-12 15:59:53 所属栏目:百科 来源:网络整理
导读:1.rank函数 rank计算一组值的排名,返回数字类型。排名可能是不连续。如果有5人,其中有2个人排名第一,则rank返回的排名结果为:1 13 4 5。 作为一个聚合函数,返回虚拟行在样表中的排名。 作为一个解析函数,返回每一个的排名。 1.1聚合函数语法 1.2解析函

1.rank函数

rank计算一组值的排名,返回数字类型。排名可能是不连续。如果有5人,其中有2个人排名第一,则rank返回的排名结果为:1 13 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 123 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,
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,
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是第二。排名是连续是连续的。



一个和最后一个相关的例子

DENSE_RANK()over( partition BY TO_CHAR(ds.stat_date,'YYYY-MM') order by SUM(ds.ORDER_AMOUNT) DESC) paiming,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读