这道题目要求我们计算每个在职员工的薪水增长,我们要做的事情如下:
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