【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;
相关推荐
java_nnnn6 小时前
LeetCode刷题滑动窗口(串联所有单词的子串+最小覆盖的子串)Java
算法·leetcode·职场和发展
泡海椒7 小时前
JQuick-SQL CSV 文件数据接入:转换为内存表后再查询
数据库·sql
Navigator_Z7 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
smilejingwei8 小时前
时间列转行再转置为新交叉表
sql·sqlazy·ai写sql·可信sql
泡海椒9 小时前
JQuick-SQL 与关系型数据库集成:应用层读取后注册查询
数据库·sql
程序员塔塔喵9 小时前
【MySQL篇|第二篇】慢SQL及其优化手段
sql·mysql·慢sql优化
Nuanyt9 小时前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode
春弦_11 小时前
LeetCode Hot 100 刷题笔记
笔记·leetcode·哈希算法
Warolitbos12 小时前
【数据库】SQL进阶15题,窗口函数/索引/事务一页速查
数据库·sql·学习·mysql·面试
从零数据分析12 小时前
零基础学SQL 23:和上月比总对不上?LAG/LEAD 一步取出上一次(附 4 个模板)
java·数据库·sql·mysql·oracle·sqlite·database