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

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、付费专栏及课程。

余额充值