rank() over

来源:互联网 发布:达内linux视频 百度云 编辑:程序博客网 时间:2024/06/05 01:05
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