这道题目要求我们计算每个在职员工的薪水增长,我们要做的事情如下:

1. 确定总体问题

我们需要计算在职员工自入职以来的薪水涨幅,并返回员工编号及其对应的薪水涨幅。需要从员工表和薪水表中提取数据,通过员工编号进行连接,计算每个在职员工的薪水增长,并按增长幅度升序排列。

2. 分析关键问题

  • 获取入职时的薪水:通过员工的入职日期匹配薪水的生效日期。
  • 获取当前薪水:筛选出当前在职员工的最新薪水记录。
  • 计算薪水增长:计算当前薪水与入职时薪水的差值。
  • 排序输出:按薪水增长幅度升序排列输出结果。

3. 解决每个关键问题的代码及讲解

步骤1:获取入职时的薪水

我们通过员工的入职日期匹配薪水的生效日期,获取入职时的薪水:

select 
    s.emp_no,
    s.salary
from salaries s 
join employees e on e.hire_date = s.from_date
  • JOIN employees e ON e.hire_date = s.from_date:通过员工的入职日期匹配薪水的生效日期。
步骤2:获取当前薪水

我们筛选出当前在职员工的最新薪水记录:

select 
    emp_no,
    to_date,
    salary
from salaries
where to_date = '9999-01-01'
  • WHERE to_date = '9999-01-01':题目表明:to_date='9999-01-01'时,表示依然在职,无后续调整记录,故使用where筛选出当前在职员工的最新薪水记录。
步骤3:计算薪水增长

我们计算当前薪水与入职时薪水的差值:

select
    n.emp_no,
    n.salary - o.salary as growth
from(
    ...
)o#Onboarding
join(
    ...
)n#now
on o.emp_no = n.emp_no
  • n.salary - o.salary AS growth:计算薪水增长。
步骤4:排序输出

我们使用ORDER BY按薪水增长幅度升序排列输出结果:

order by
    growth
  • ORDER BY growth:按薪水增长幅度升序排列。

完整代码

#入职工资
select
    n.emp_no,
    n.salary - o.salary as growth
from(
    select 
    s.emp_no,
    s.salary
    from salaries s 
    join employees e on e.hire_date = s.from_date  
)o#Onboarding
#当前工资
join(
    select 
    emp_no,
    to_date,
    salary
    from salaries
    where to_date = '9999-01-01'
)n#now
    on o.emp_no = n.emp_no
order by
    growth