问题描述
在员工表中,同部门内选取工资前三的人进行展示
建表语句:
create table employee
(
id bigint auto_increment
primary key,
name varchar(20) null, -- 姓名
salary bigint null, -- 工资
departmentId bigint null -- 部门
);
表数据:
id | name | salary | departmentId |
---|---|---|---|
1 | Joe | 85000 | 1 |
2 | Henry | 80000 | 2 |
3 | Sam | 60000 | 2 |
4 | Max | 90000 | 1 |
5 | Janet | 69000 | 1 |
6 | Randy | 85000 | 1 |
7 | Will | 70000 | 1 |
方法
见Leetcode大佬解答方案:
select e1.*
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) < 3
- 1.表自身和自身进行链接,使得部门相同的进行链接,连接后每个人都和自己部门其他人(包括自己)组成一条数据
- 2.筛选出其中其他人工资高于自己工资的数据
- 3.根据主表的ID进行分组,分组后每个人仅剩余一条记录
- 4.使用聚合函数展示每条记录工资高于自身的人的数量
- 5.使用having过滤掉数量大于等于三的
如果你的工资在前三的范围内,那么比你工资高的就只能是两个一个或者零个
解析
首先我们先看一下
select e1.id, e2.id
from employee e1
inner join employee e2 on e1.departmentId = e2.departmentId and e1.salary < e2.salary
的一个执行结果
我们可以看到最后的一个内联结果是e1工资小于e2工资id的一个笛卡尔积
然后我们根据e1的id进行分组,这个组的count数就是工资大于你的人数