牛客网:数据库SQL实战

[编程题]获取所有部门中当前员工薪水最高的相关信息

链接:https://www.nowcoder.com/questionTerminal/4a052e3e1df5435880d4353eb18a91c6?toCommentId=2532561
来源:牛客网

此题目中,需要注意GROUP BY语句之后必须出现SELECT语句中出现的所有非聚集函数列,否则会产生不匹配的问题。

测试使用前8个职员的数据。(网站用例没看到第九个及之后的完整salaries信息)。解题思路是首先将需要的信息联结成一张表,使用语句:

select d.dept_no,d.emp_no,s.salary
         from dept_emp as d
             join salaries as s
                 on d.emp_no = s.emp_no
                     and d.to_date='9999-01-01'
                         and s.to_date ='9999-01-01'

查询结果:
联结表信息

//然后对此表进行查询
select jtable.dept_no,jtable.emp_no,MAX(jtable.salary)
from (select d.dept_no,d.emp_no,s.salary
         from dept_emp as d
             join salaries as s
                 on d.emp_no = s.emp_no
                     and d.to_date='9999-01-01'
                         and s.to_date ='9999-01-01')as jtable
group by jtable.dept_no;

查询结果如下:
查询结果
可以看到选中行的列信息并不匹配(d004部门薪资最高值的emp_no为10004而不是10003),虽然这样可以通过牛客的测试。但是如何真正解决这个问题呢?求评论!

   如果在SELECT语句中的非聚集函数列在GROUP BY语句中没有出现,假设在聚集时选取聚集簇的第一行,那么,可以提供一种思路:
    select d.dept_no,d.emp_no,s.salary
             from dept_emp as d
                 join salaries as s
                     on d.emp_no = s.emp_no
                         and d.to_date='9999-01-01'
                             and s.to_date ='9999-01-01'
                                  order by s.salary desc;
           --对联结表的结果做排序处理,这样可以保证同一部门中薪资高的员工信息总是出现在上面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值