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