Leetcode 3482. 分析组织层级
1.题目基本信息
1.1.题目描述
表:Employees
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| employee_id | int |
| employee_name | varchar |
| manager_id | int |
| salary | int |
| department | varchar |
+----------------+----------+
employee_id 是这张表的唯一主键。
每一行包含关于一名员工的信息,包括他们的 ID,姓名,他们经理的 ID,薪水和部门。
顶级经理(CEO)的 manager_id 是空的。
编写一个解决方案来分析组织层级并回答下列问题:
层级:对于每名员工,确定他们在组织中的层级(CEO 层级为 1,CEO 的直接下属员工层级为 2,以此类推)。
团队大小:对于每个是经理的员工,计算他们手下的(直接或间接下属)总员工数。
薪资预算:对于每个经理,计算他们控制的总薪资预算(所有手下员工的工资总和,包括间接下属,加上自己的工资)。
返回结果表以 层级 升序 排序,然后以预算 降序 排序,最后以 employee_name 升序 排序。
1.2.题目地址
https://leetcode.cn/problems/analyze-organization-hierarchy/description/
2.解题方法
2.1.解题思路
递归+分组聚合
2.2.解题步骤
第一步,递归获取各个员工的层级
第二步,基于T1,递归查询各个员工的所属关系记录(子树查询)
第三步,基于T2根据group_id进行分组聚合,计算团队大小(注意减去老大本身的一个)、团队预算薪资
3.解题代码
sql代码
# Write your MySQL query statement below
WITH RECURSIVE T1 AS (
# 第一步,递归获取各个员工的层级
SELECT
employee_id, employee_name, manager_id, salary, department,
1 AS level
FROM Employees
WHERE manager_id IS NULL
UNION ALL
# 下一层的递归记录
SELECT
e.employee_id, e.employee_name, e.manager_id, e.salary, e.department,
level + 1 AS level
FROM
Employees AS e JOIN T1 ON e.manager_id = T1.employee_id
), T2 AS (
# 第二步,基于T1,递归查询各个员工的所属关系记录(子树查询)
SELECT
employee_id, employee_name, salary, level,
employee_id AS group_id
FROM T1
UNION ALL
SELECT
T1.employee_id, T2.employee_name, T1.salary, T2.level,
T2.group_id
FROM
T1 JOIN T2 ON T1.manager_id = T2.employee_id
)
# 第三步,基于T2根据group_id进行分组聚合,计算团队大小(注意减去老大本身的一个)、团队预算薪资
SELECT
group_id AS employee_id, employee_name,
level,
COUNT(1) - 1 AS team_size,
SUM(salary) AS budget
FROM T2
GROUP BY group_id
ORDER BY level, budget DESC, employee_name
4.执行结果


浙公网安备 33010602011771号