一、数据
表: Employees
+-------------+---------+ | Column Name | Type | +-------------+---------+ | emp_id | int | | emp_name | varchar | | dep_id | int | | position | varchar | +-------------+---------+ emp_id 是这张表具有唯一值的列。 这张表包括 emp_id, emp_name, dep_id,和 position。
查询 最大部门 的 经理 的 名字。当拥有相同数量的员工时,可能会有多个最大部门。
返回 按照 dep_id
升序 排列的结果表格。
结果表格的格式如下例所示。
示例 1:
输入: Employees table: +--------+----------+--------+---------------+ | emp_id | emp_name | dep_id | position | +--------+----------+--------+---------------+ | 156 | Michael | 107 | Manager | | 112 | Lucas | 107 | Consultant | | 8 | Isabella | 101 | Manager | | 160 | Joseph | 100 | Manager | | 80 | Aiden | 100 | Engineer | | 190 | Skylar | 100 | Freelancer | | 196 | Stella | 101 | Coordinator | | 167 | Audrey | 100 | Consultant | | 97 | Nathan | 101 | Supervisor | | 128 | Ian | 101 | Administrator | | 81 | Ethan | 107 | Administrator | +--------+----------+--------+---------------+ 输出 +--------------+--------+ | manager_name | dep_id | +--------------+--------+ | Joseph | 100 | | Isabella | 101 | +--------------+--------+ 解释 - 部门 ID 为 100 和 101 的每个部门都有 4 名员工,而部门 107 有 3 名员工。由于部门 100 和 101 都拥有相同数量的员工,它们各自的经理将被包括在内。 输出表格按 dep_id 升序排列。
二、分析
表格中给了每位员工的id、名字、所属部门id和他的职位。
为了解决问题,就需要先找出每个部门的人数,然后按照部门人数进行排序,找出人数最多的部门,最后筛选出在给部门中为Manager的人并返回。
三、代码
with t1 as (
select
emp_name,dep_id,position,count(1) over(partition by dep_id) cnt -- 找出每个部门的人数
from employees
)
,t2 as (
select *,dense_rank() over (order by cnt desc) rk -- 按部门人数进行排序
from t1
)
select emp_name manager_name, dep_id
from t2
where rk = 1 and position = 'Manager' -- 筛选出部门人数最多且职位为Manager的人
order by dep_id
;
四、总结
本题的难度较低,需要注意的是当拥有相同数量的员工时,可能会有多个最大部门,需要全部返回,所以在排序的时候需要使用dense_rank()函数。