使用Oracle提供的sample数据。
查询每个员工在自己部门中和公司中的工资排名:
select deptno, empno, ename, sal,
rank() over (partition by deptno order by sal desc) as rank_value,
dense_rank() over (partition by deptno order by sal desc) as dense_rank_value,
row_number() over (partition by deptno order by sal desc) as row_number_rank_value,
rank() over (order by sal desc) as rank_value_all
from emp
这里注意rank_value是员工在部门工资的排名, rank_value_all是员工在公司工资的排名。当使用了order by子句,oracle将添加一个默认的开窗子句,因此这两列使用的行的集合是在当前分区中当前行和前面所有行的。
查询每个部门中工资第二高的员工:
SELECT dep_id,emp_id
FROM (
SELECT dep_id,RANK() OVER (PARTITION BY dep_id ORDER BY salary DESC) rank_num,emp_id
FROM employee)
WHERE rank_num = 2
注意这里不要想去掉子查询。分析函数不能直接写在where条件里。<