大佬666
三个窗口即可解决第一个窗口取最新一次薪资第二个窗口取第一次薪资第三个窗口取每个员工最大的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 growthfrom(    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) twhere    f_dt = '9999-01-01' and (r1 = 1 or r2 = 1)group by    emp_noorder by    growth asc;
点赞 5
评论 1
全部评论

相关推荐

01-14 16:23
广州商学院 Java
苏雨棠:加油朋友,你一定会找到的,一定要坚持,我最近上岸了,哈哈,找了三个月了,之前面试老是被刷,然后有大神发了一个AI语音面试工具给我,跟练了一个礼拜,面试水平一下子上去了😄真的好给力
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务