rank() over

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> select * from (select e.*,dense_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 1982/1/23     1300.00               10          1
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10          2
 7839 KING       PRESIDENT       1981/11/17    5000.00               10          3
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20          1
 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20          2
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20          3
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30          1
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30          2
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30          2
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30          3
 
10 rows selected
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值