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
还没有评论,来说两句吧...