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
----- ---------- --------- ------- -------------- ------ ------ ------ ----------
已选择9行。
rank和dense_rank
根据order by的内容依次赋予递增序列
rank 和 dense_rank区别:
他们遇到相同值不会递增 都显示当前序列值
遇到相同值rank会跳号,dense_rank不跳号
但下一个不同的值出现时:
rank: 会累计
dense_rank:不会累计
SQL> break on deptno skip 1
SQL> select deptno,
---------- ---------- ---------- ---------- ----------
10 KING
5000
1
1
20 SCOTT
3000
1
1
30 BLAKE
2850
1
1
14 rows selected.