You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:21:02