如何使用SQLite查询各部门第N高的薪资
解法1:关联子查询写法(兼容绝大多数SQL方言)
你原有写法的核心问题是子查询没有限定和外层查询统计同一个部门的薪资,不需要额外写join,只要在子查询的条件里加上部门匹配逻辑即可,正确代码如下:
-- 代码里的N替换为实际要查询的排名数字,比如查第3高就替换为3 SELECT DISTINCT E1.department_id, E1.department, E1.SAL FROM employees E1 WHERE (N - 1) = ( SELECT COUNT(DISTINCT E2.SAL) FROM employees E2 WHERE E2.department_id = E1.department_id AND E2.SAL > E1.SAL );
原有错误代码问题说明:
- 内层多余的join完全没有必要,且没有和外层的部门做关联,子查询统计的是全表范围内比当前薪资高的薪资数量,不是同部门范围内的数值,所以加group by也无法得到正确结果
- 要返回部门维度的结果,查询字段里需要带上部门标识信息,否则无法对应薪资所属的部门
解法2:窗口函数写法(更简洁,支持MySQL8.0+/PostgreSQL/Oracle等主流新版数据库)
用排名窗口函数可以更直观实现需求,避免嵌套子查询的复杂逻辑:
WITH dept_sal_rank AS ( SELECT department_id, department, SAL, DENSE_RANK() OVER(PARTITION BY department_id ORDER BY SAL DESC) AS sal_rank FROM employees ) SELECT DISTINCT department_id, department, SAL FROM dept_sal_rank WHERE sal_rank = N; -- 替换N为实际要查询的排名数字
补充说明:如果需要实现并列排名后跳名次的逻辑(比如两个第1高之后直接是第3高),把
DENSE_RANK换成RANK即可;如果需要给相同薪资分配不同排名(哪怕薪资一致也按顺序排先后),换成ROW_NUMBER即可。
内容的提问来源于stack exchange,提问作者financial_physician
相关产品推荐
相关产品推荐

