select
new.emp_no,
new.last_sal - old.pre_sal growth
from
(
# 所有员工的最初始的薪水,包括已经离职的员工
# 后面和在职员工薪资join,会自动去掉离职人员的薪资信息
select distinct
emp_no,
# 使用开窗函数,少使用一次和员工表的join操作,效率更高
first_value (salary) over (
partition by
emp_no
order by
from_date
) pre_sal
from
salaries
) old
join (
# 查询在职员工的最新薪资情况
select
emp_no,
salary last_sal
from
salaries
where
to_date = '9999-01-01'
) new on old.emp_no = new.emp_no
order by
growth
测试数据中存在降薪情况,所以不建议使用max,min函数。
解题思路:在职员工的当前薪资 - 员工入职时的薪资
当前薪资直接使用where to_date='9999-01-01'即可查询出来
入职时的薪资,可以把员工表和薪资表join起来,在这里使用了开窗函数 first_value,避免表的join操作,因为表join效率比较低

京公网安备 11010502036488号