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 belowWITH RECURSIVE T1 AS (# 第一步,递归获取各个员工的层级SELECT employee_id, employee_name, manager_id, salary, department, 1 AS levelFROM EmployeesWHERE manager_id IS NULLUNION ALL# 下一层的递归记录SELECT e.employee_id, e.employee_name, e.manager_id, e.salary, e.department, level + 1 AS levelFROM 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_idFROM T1 UNION ALL SELECT T1.employee_id, T2.employee_name, T1.salary, T2.level, T2.group_idFROM 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