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.执行结果

posted @ 2025-06-29 08:35  Geek0070  阅读(26)  评论(0)    收藏  举报