题解 | #查找在职员工自入职以来的薪水涨幅情况#
查找在职员工自入职以来的薪水涨幅情况
https://www.nowcoder.com/practice/fc7344ece7294b9e98401826b94c6ea5
三个窗口即可解决
第一个窗口取最新一次薪资
第二个窗口取第一次薪资
第三个窗口取每个员工最大的to_date,用于判断是否在职
过滤出to_date='9999-01-01',即在职的员工,然后再过滤出第一次薪资记录和最新一次薪资记录,
这样每个员工最多只有2条记录,第一次和最新一次,特殊情况是从来没有变动过工资,只有一条数据。
计算薪资变动,需要判断是否从来没调整过工资,如果是则为0,
否则用最后一次薪资-第一次薪资,即:第一次薪资*-1,然后再sum。
select emp_no, case count(1) when 1 then 0 else sum(case when r2 = 1 then salary * -1 else salary end ) end as growth from( select *, row_number() over (partition by emp_no order by from_date desc) as r1, row_number() over (partition by emp_no order by from_date asc ) as r2, first_value(to_date) over(partition by emp_no order by to_date desc) as f_dt from salaries s ) t where f_dt = '9999-01-01' and (r1 = 1 or r2 = 1) group by emp_no order by growth asc;