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效率比较低