题解 | #写了三种解法 然后各不相同吧 感觉SQL的技术含量就在join over groupby 这三个里面了#

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

http://www.nowcoder.com/practice/fc7344ece7294b9e98401826b94c6ea5



# 取差值为growth 犯懒写了qq
select emp_no,mas-mis as qq from
# 开窗函数 在旁边加最大to日期、最小from日期、最大工资、最小工资
# 如果最后不需要识别尚在我司员工(用于判断growth = 0时显不显示) 则不需要最大to日期、最小from日期
(select *,( max(to_date) over (partition by emp_no) ) as td,
          ( min(from_date) over (partition by emp_no) ) as fd, 
          ( min(salary) over (partition by emp_no) ) as mis, 
          ( max(salary) over (partition by emp_no) ) as mas
 from salaries) as t1
#  挑选离职或最新工资 以及初始工资 并且要求growth > 0 或者 员工尚在我司
 where (to_date=td or from_date = fd) and (mas-mis>0 or td = '9999-01-01')
#  去掉重复列 前面用distinc(*)也行
# 重复的原因是我们实际没有考虑每条记录的salary值 而是直接生成了最大最小列 所以一个人有多少条他就有几次重复
# 我们只考虑了每条的日期
 group by emp_no
 order by qq

# select e1,growth from
# (SELECT e1,mas-mis as growth from
# (select * from
#     (select emp_no as e1 , max(salary) as mas from salaries group by emp_no) as t1
# left join 
# (select emp_no as e2 , min(salary) as mis from salaries group by emp_no) as t2
# on e1 = e2) as t3) as t6
# left join 
# (select emp_no as e3, max(to_date) as dd from salaries group by emp_no) as t4
# on e1 = e3
# where growth > 0 or dd = '9999-01-01'
# order by growth




# select * from
# (select * from
# (salaries left join 
# (select emp_no as e1,max(to_date) as td from salaries group by emp_no) as t1
# on t1.e1 = salaries.emp_no)) as t3
# where to_date = td 

# union
# select * from
#  (select * from
# (salaries left join 
#  (select emp_no as e2,min(from_date) as fd from salaries group by emp_no) as t2
#  on emp_no = t2.e2)) as t4



全部评论

相关推荐

程序员小白条:排版,格式难顶,换个简洁的,保底offer没问题
你的简历改到第几版了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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