如何用SQL查询未获得过加薪的员工?有无其他实现方式?
从未加薪员工查询的多种实现方案
你当前编写的Select empid,name from sal_hist group by empid,name having count(1)=1;语句,在「所有薪资变动都会新增一条记录、且薪资调整只有上涨/新入职两种场景」的业务规则下可以跑出正确结果,符合你给出的示例数据需求,但存在边界场景漏洞:如果员工有多条薪资记录但薪资从未上涨(比如薪资始终持平、或有降薪情况),会被误排除。
以下是多种不同的实现方案,部分方案可以兼容上述边界场景:
- 方案1:薪资极值对比法
如果员工从未有过加薪,那么他历史所有薪资记录的最大值与最小值必然相等,不受记录条数限制:
SELECT empid, name FROM sal_hist GROUP BY empid, name HAVING MAX(salary) = MIN(salary);
- 方案2:自连接反向过滤法
直接匹配「同一员工后续生效日期薪资高于之前薪资」的记录,找不到匹配项的员工就是从未加薪的员工,完全贴合需求本质,兼容所有边界场景:
SELECT DISTINCT s1.empid, s1.name FROM sal_hist s1 LEFT JOIN sal_hist s2 ON s1.empid = s2.empid AND s2.effective_date > s1.effective_date AND s2.salary > s1.salary WHERE s2.empid IS NULL;
- 方案3:窗口函数校验法
通过LAG窗口函数取每个员工上一次的薪资,判断是否存在薪资上涨的记录:
WITH sal_diff AS ( SELECT empid, name, LAG(salary) OVER (PARTITION BY empid ORDER BY effective_date) AS pre_salary, salary FROM sal_hist ) SELECT DISTINCT empid, name FROM sal_diff GROUP BY empid, name HAVING MAX(CASE WHEN salary > pre_salary THEN 1 ELSE 0 END) = 0;
内容的提问来源于stack exchange,提问作者Sneha S
相关产品推荐
相关产品推荐

