【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量

【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量

复制代码
要求:对于此问题,我们将至少有一个其他员工需要向他汇报的员工,视为一个经理。
编写一个解决方案来返回需要听取汇报的所有经理的 ID、名称、直接向该经理汇报的员工人数,以及这些员工的平均年龄,其中该平均年龄需要四舍五入到最接近的整数。
返回的结果集需要按照 employee_id 进行排序。

解题思路:

1、使用了内连接,将Employees表连接自身,通过employee_id和reports_to匹配,然后分组统计。

2、对于识别出的每一位经理 (E1),我们需要对他所有的下属 (E2) 进行聚合计算。

• COUNT(E2.employee_id):统计该经理名下有多少条汇报记录,即下属人数 (reports_count)。

• AVG(E2.age):计算这些下属年龄的平均值。

• ROUND(..., 0):将平均年龄四舍五入到整数。

3、分组和排序​​:

• GROUP BY E1.employee_id:确保所有的统计计算都是按每个经理单独进行的。

• ORDER BY E1.employee_id:按要求以 employee_id顺序返回结果。

代码:

sql 复制代码
SELECT
    E1.employee_id,
    E1.name,
    COUNT(E2.employee_id)AS reports_count,
    ROUND(AVG(E2.age),0)AS average_age
FROM
    Employees E1
JOIN
    Employees E2
ON E1.employee_id = E2.reports_to
GROUP BY E1.employee_id
ORDER BY E1.employee_id

重点:

1、一开始我选择用左连接,通过employee_id和reports_to匹配,然后但是左连接会保留左表的所有记录,即所有经理,即使用户的代码中可能没有下属的员工也会被包括进来。

结果:

我想过加判断:使用 LEFT JOIN来匹配员工和他们的下属,然后通过过滤条件(reports_count = 0, average_age IS NULL)来移除那些不是经理的员工。

但是代码没有用内连接的简洁,性能也没有内连接高效。

代码:

sql 复制代码
SELECT
    E1.employee_id,
    E1.name,
    COUNT(E2.employee_id) AS reports_count,
    ROUND(AVG(E2.age), 0) AS average_age
FROM
    Employees E1
LEFT JOIN
    Employees E2 ON E1.employee_id = E2.reports_to
GROUP BY
    E1.employee_id, E1.name
HAVING
    COUNT(E2.employee_id) > 0 AND AVG(E2.age) IS NOT NULL
ORDER BY
    E1.employee_id;
相关推荐
Hi李耶1 小时前
【LeetCode】9-回文数
算法·leetcode·职场和发展
海绵天哥5 小时前
LeetCode Hot 100 | 链表(下)· 分组翻转与设计(C++ 题解)
c++·leetcode·链表
snow@li19 小时前
MyBatis:动态 SQL 全景梳理
数据库·sql·mybatis
tkevinjd20 小时前
力扣131-分割回文串
算法·leetcode·深度优先
z落落20 小时前
T-SQL 事务(Transaction)
java·数据库·sql
ClouGence21 小时前
MySQL迁移到达梦怎么做?信创数据库低停机迁移实战
数据库·sql·mysql
zander2581 天前
LeetCode 78. 子集
算法·leetcode·深度优先
Tisfy1 天前
LeetCode 3014.输入单词需要的最少按键次数 I:遍历 / if-else计算(比纯数学公式写起来麻烦但好想)
数学·算法·leetcode·字符串·题解·贪心
tkevinjd1 天前
力扣239-滑动窗口最大值
算法·leetcode·职场和发展
NineData1 天前
Oracle 长事务正在消耗 undo 空间,ChatDBA 能提前发现
数据库·sql·oracle·agent·ninedata·回滚·长事务