题解 | #查找在职员工自入职以来的薪水涨幅情况#

查找在职员工自入职以来的薪水涨幅情况

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;

全部评论
大佬666
点赞 回复 分享
发布于 2024-01-04 17:00 北京

相关推荐

评论
3
3
分享

创作者周榜

更多
牛客网
牛客企业服务