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
----- ---------- --------- ------- -------------- ------ ------ ------ ----------
已选择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
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