1. 手写 SQL,查询每个部门工资第二高的员工(考虑并列与不存在的情况),窗口函数与相关子查询两种写法?
手写 SQL:查询每个部门工资第二高的员工(考虑并列与不存在的情况),窗口函数与相关子查询两种写法?
- 窗口函数排名
- 相关子查询
- 第二高
窗口函数写法:用 DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary DESC) 排名,取 rn=2。若并列算同一名次用 DENSE_RANK(并列都算第二),若并列算不同名次用 ROW_NUMBER。相关子查询写法:自连接比较,找出工资第二高的人(工资小于该部门最高工资中的最大值)。处理不存在(部门只有一人/无第二高)时,窗口写法会无匹配行,可注意。常用 DENSE_RANK 并列语义。
窗口函数用 DENSE_RANK 排名取 rn=2,相关子查询自连接比较工资。并列用 DENSE_RANK。
-- 窗口函数(并列算同一名次)
SELECT * FROM (
SELECT e.*, DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) rn
FROM emp e
) t WHERE rn = 2;
-- 相关子查询
SELECT * FROM emp e
WHERE salary = (
SELECT MAX(salary) FROM emp e2
WHERE e2.dept_id = e.dept_id AND e2.salary <
(SELECT MAX(salary) FROM emp e3 WHERE e3.dept_id = e.dept_id)
);