SQL问题:查询各薪资等级下工龄最长前2名员工结果异常求解
原有SQL问题排查
- 核心逻辑不符合需求:你的WHERE条件子查询是从全量员工表取工龄最长的2个值,没有按薪资等级分组,完全无法实现「每个薪资等级下取工龄最长2名员工」的要求
- 子查询逻辑错误:对Experience字段group by后取top 2,只会返回全局最高的2个工龄数值,会把所有等级里工龄等于这两个值的员工都筛选出来,和按等级取TOP的需求完全不匹配
正确实现
使用窗口函数按薪资等级分组排序后取TOP 2即可,代码如下:
SELECT GRADE, NAME, Experience FROM ( SELECT s.GRADE, e.NAME, e.Experience, -- 按薪资等级分组,组内按工龄倒序排序,生成序号 ROW_NUMBER() OVER(PARTITION BY s.GRADE ORDER BY e.Experience DESC) AS rn FROM SALARY_GRADE as S JOIN EMPLOYEE_SALGRADE AS ES ON S.GRADE = es.GRADE_NO JOIN EMPLOYEE as e ON es.Employee_no = e.EMPLOYEE_NO ) t WHERE rn <= 2 -- 可选:按等级、工龄倒序排序输出 ORDER BY GRADE, Experience DESC
补充说明
如果需要处理工龄相同的并列场景,可以将ROW_NUMBER()替换为RANK(),如果同等级有多个工龄相同的员工并列第2,会全部返回,你可以根据实际需求选择。
内容的提问来源于stack exchange,提问作者Rafał Rymuza
相关产品推荐
相关产品推荐

