当前位置: 首页 > news >正文

[每日一练]利用自连接实现数量查询

该题目来源于力扣:

1731. 每位经理的下属员工数量 - 力扣(LeetCode)

题目要求:

表:Employees+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| employee_id | int      |
| name        | varchar  |
| reports_to  | int      |
| age         | int      |
+-------------+----------+
employee_id 是这个表中具有不同值的列。
该表包含员工以及需要听取他们汇报的上级经理的 ID 的信息。 有些员工不需要向任何人汇报(reports_to 为空)。对于此问题,我们将至少有一个其他员工需要向他汇报的员工,视为一个经理。编写一个解决方案来返回需要听取汇报的所有经理的 ID、名称、直接向该经理汇报的员工人数,以及这些员工的平均年龄,其中该平均年龄需要四舍五入到最接近的整数。返回的结果集需要按照 employee_id 进行排序。结果的格式如下:示例 1:输入:
Employees 表:
+-------------+---------+------------+-----+
| employee_id | name    | reports_to | age |
+-------------+---------+------------+-----+
| 9           | Hercy   | null       | 43  |
| 6           | Alice   | 9          | 41  |
| 4           | Bob     | 9          | 36  |
| 2           | Winston | null       | 37  |
+-------------+---------+------------+-----+
输出:
+-------------+-------+---------------+-------------+
| employee_id | name  | reports_count | average_age |
+-------------+-------+---------------+-------------+
| 9           | Hercy | 2             | 39          |
+-------------+-------+---------------+-------------+
解释:
Hercy 有两个需要向他汇报的员工, 他们是 Alice and Bob. 他们的平均年龄是 (41+36)/2 = 38.5, 四舍五入的结果是 39.

思路流程:

可见,我们需要将被报道的人作为emoloyee_id的形式,显示向他们报告的employee_id,并将这里的employee_id的数量化为reports_count。我们如果想将原表格中的reports_to的id转换为employee_id,可以使用自连接,使前表的emoloyee_id=后表的reports_to,我们先连接查看结果

select * average_age 
from Employees e1
join Employees e2
on e1.reports_to=e2.employee_id 
/*
| employee_id | name  | reports_to | age | employee_id | name  | reports_to | age |
| ----------- | ----- | ---------- | --- | ----------- | ----- | ---------- | --- |
| 4           | Bob   | 9          | 36  | 9           | Hercy | null       | 43  |
| 6           | Alice | 9          | 41  | 9           | Hercy | null       | 43  |
*/

由此可见,在连接的表中,原reports_to中的数据成功对调。在自连接的表中,我们可以用到前表的age列进行平均值的计算,记得用round函数实现四舍五入。其他要求的数据都在后表。

代码实现

# Write your MySQL query statement below
select e2.employee_id,e2.name,count(e2.name) reports_count,round(avg(e1.age),0) average_age 
from Employees e1
join Employees e2
on e1.reports_to=e2.employee_id 
group by e2.employee_id 
order by e2.employee_id asc

总结:当遇到需要对调立场的,相关联的多列数据时,尝试使用自连接可以发现不同的大陆。

相关文章:

  • MySQL | excel数据输出insert语句
  • 第167天:应急响应-日志自动提取分析项目_ELK_Logkit_LogonTracer_Anolog等
  • 力扣随机一题——所有元音按顺序排序的最长字符串
  • 数据驱动农业——助力作物增产
  • 新书推荐——《Python贝叶斯深度学习》
  • 基于php的民宿预订管理系统
  • 计算机视觉学习---图像增强
  • 图像处理基础知识点简记
  • 什么是区块链桥?
  • 理解Python闭包概念
  • Windows下VScode快速配置OpenCV开发环境 【快乐篇】
  • Pytorch 学习手册
  • LeetCode 面试经典150题 69.x的平方根
  • SpringBoot整合JPA 基础使用
  • [网络]NAT、代理服务、内网穿透、内网打洞
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • docker-consul
  • HTML中设置input等文本框为不可操作
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • node和express搭建代理服务器(源码)
  • rabbitmq延迟消息示例
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue--为什么data属性必须是一个函数
  • vue中实现单选
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 技术胖1-4季视频复习— (看视频笔记)
  • 每天10道Java面试题,跟我走,offer有!
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 双管齐下,VMware的容器新战略
  • 微信公众号开发小记——5.python微信红包
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 一天一个设计模式之JS实现——适配器模式
  • 怎样选择前端框架
  • Spring Batch JSON 支持
  • ​IAR全面支持国科环宇AS32X系列RISC-V车规MCU
  • # Maven错误Error executing Maven
  • # 飞书APP集成平台-数字化落地
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (回溯) LeetCode 77. 组合
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)opengl函数加载和错误处理
  • (四)软件性能测试
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)