oracle Rank() over(partition by XX order by XX)

本文详细介绍了SQL中的排名函数rank()和dense_rank()的使用方法,包括如何通过partition by进行分组,并结合order by进行排序,以实现数据的有效分析。通过具体实例展示了不同部门内薪资排名的查询方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rank() over (partition by xx order by xx)

1、partition  by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。
2、Rank 是在每个分组内部进行排名的。

例如:查询emp表中每个部门中工资前三名的员工的全部字段

SQL> select * from (select e.*,rank() over (partition by deptno order by sal) rk from emp e) t1 where t1.rk<=3;

EMPNO ENAME      JOB           MGR HIREDATE          SAL   COMM     DEPTNO         RK
----- ---------- --------- ------- -------------- ------ ------ ------ ----------
 7934 MILLER     CLERK        7782 23-1月 -82       1300            10          1
 7782 CLARK      MANAGER      7839 09-6月 -81       2450            10          2
 7839 KING       PRESIDENT         17-11月-81       5000            10          3
 7369 SMITH      CLERK        7902 17-12月-80        800            20          1
 7566 JONES      MANAGER      7839 02-4月 -81       2975            20          2
 7902 FORD       ANALYST      7566 03-12月-81       3000            20          3
 7900 JAMES      CLERK        7698 03-12月-81        950            30          1
 7521 WARD       SALESMAN     7698 22-2月 -81       1250    500     30          2
 7654 MARTIN     SALESMAN     7698 28-9月 -81       1250   1400     30          2

已选择9行。


rank和dense_rank
根据order by的内容依次赋予递增序列
rank 和 dense_rank区别:
他们遇到相同值不会递增 都显示当前序列值
遇到相同值rank会跳号,dense_rank不跳号
但下一个不同的值出现时:
rank:   会累计
dense_rank:不会累计

SQL> break on deptno skip 1
SQL> select deptno,
   ename,
   sal,
   rank() over(partition by deptno order by sal desc) rank_sal,
   dense_rank() over(partition by deptno order by sal desc) dense_rank 
     from emp;

    DEPTNO ENAME     SAL   RANK_SAL DENSE_RANK
---------- ---------- ---------- ---------- ----------
10 KING    5000  1     1
  CLARK    2450  2     2
  MILLER    1300  3     3

20 SCOTT    3000  1     1
  FORD    3000  1     1
  JONES    2975  3     2
  ADAMS    1100  4     3
  SMITH     800  5     4

30 BLAKE    2850  1     1
  ALLEN    1600  2     2
  TURNER           1500  3     3
  MARTIN           1250  4     4
  WARD    1250  4     4
  JAMES     950  6     5


14 rows selected.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值