LeetCode 数据库 SQL SERVER 185 部门工资前三高的所有员工

题目链接

题目

解题思路

思路参照评论区点赞第一的大佬。
由于对 sql 语法还不是很熟悉,在思路描述上可能会出现词不达意的情况。
尝试解题时,首先想到的是将每个部门工资前三高的员工(id)主键找出来。
感觉在说废话。。。。。。
问题的关键在于如何找到每个部门工资前三员工的id。
通过表的自身连接,可以使每一个员工和所有员工都连接成一个元组。
这样每个员工和所有员工都有操作空间了。
要求的是每个部门,那么每一个员工就不需要和所有员工产生元组了,只需要和自己部门的员工产生一个元组就可以了。
在连接时按照部门 id 相等进行连接就可以实现该操作。
如何找到工资前三呢,只要比我工资高的工资数量小于等于二(有点绕,但是题目是这个意思),那么我就是前三了。
group by e1.id having count(distinc(e2.salary)) <= 2
自身连接时必须取别名来区分两个相同的表,e1 为表 1, e2 为表 2。
这一句是按 id 分组,且这一组的数量小于等于2。
就这样 每个部门工资前三高的员工id 就找出来了。
|
|
|
这是 SQL SERVER 代码。(各种数据库的代码几乎可以通用,如果不用花里胡哨的函数)

select d.Name as Department, e.Name as employee,e.salary as salary 
from Employee as e  left join Department as d 
on e.DepartmentId = d.Id
where e.Id in (
    select e1.id
    from employee e1 left join employee e2 
    on e1.departmentid = e2.departmentid and e1.salary < e2.salary
    group by e1.id 
    having count(distinct e2.salary) <= 2
)
and e.Departmentid in (select id from Department)
order by d.id asc, e.salary desc
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值