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

[每日一练]分组后元素最多的组别(all函数的全局比对)

#该题目来源于力扣:

1076. 项目员工II - 力扣(LeetCode)

题目要求:

表:Project+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| project_id  | int     |
| employee_id | int     |
+-------------+---------+
(project_id, employee_id) 是该表的主键(具有唯一值的列的组合)。
employee_id 是该表的外键(reference 列)。
该表的每一行都表明 employee_id 的雇员正在处理 Project 表中 project_id 的项目。
表:Employee+------------------+---------+
| Column Name      | Type    |
+------------------+---------+
| employee_id      | int     |
| name             | varchar |
| experience_years | int     |
+------------------+---------+
employee_id 是该表的主键(具有唯一值的列)。
该表的每一行都包含一名雇员的信息。编写一个解决方案来报告所有拥有最多员工的项目。以 任意顺序 返回结果表。返回结果格式如下所示。示例 1:输入:
Project table:
+-------------+-------------+
| project_id  | employee_id |
+-------------+-------------+
| 1           | 1           |
| 1           | 2           |
| 1           | 3           |
| 2           | 1           |
| 2           | 4           |
+-------------+-------------+
Employee table:
+-------------+--------+------------------+
| employee_id | name   | experience_years |
+-------------+--------+------------------+
| 1           | Khaled | 3                |
| 2           | Ali    | 2                |
| 3           | John   | 1                |
| 4           | Doe    | 2                |
+-------------+--------+------------------+
输出:
+-------------+
| project_id  |
+-------------+
| 1           |
+-------------+
解释:
第一个项目有3名员工,第二个项目有2名员工。

思路流程:

这道题只需要用到Project表。

首先,需求要求我们返回分组Project表的project_id列,所以可以先构建初始的代码:

SELECT project_id
FROM Project
GROUP BY project_id

初始的代码建立完成,现在需要建立条件列。由于需要的条件:“返回报告所有拥有最多员工的项目。”是在分组之后,所以在having列中进行条件的构建。可以通过子查询来判断

HAVING COUNT(employee_id) = 
(
SELECT COUNT(employee_id) 
FROM Project 
GROUP BY project_id
ORDER BY COUNT(employee_id) DESC
LIMIT 1
)

注意:在子查询中的语句中要限制返回的数据为升序排序后的第一位,这样就可以求得最大的分组值

联合起来为:

# Write your MySQL query statement below
SELECT project_id
FROM Project
GROUP BY project_id
HAVING COUNT(employee_id) = 
(
SELECT COUNT(employee_id) 
FROM Project 
GROUP BY project_id
ORDER BY COUNT(employee_id) DESC
LIMIT 1
)

优化1:

如果有两个组别是相同的最大值呢?

SELECT project_id
FROM Project
GROUP BY project_id
HAVING COUNT(employee_id)=
(SELECT MAX(A) 
FROM (SELECT COUNT(employee_id) AS A FROM Project GROUP BY project_id) AS data_3
)

具体思路为原始分组数据的计数=在子查询中 关于 子查询的子查询 最大值的查找。需要用到两个嵌套的子查询的用法,比较麻烦

优化2:

直接用all函数,查询出的分组聚合数据大于所有(all)的子查询聚合数据的值,也可以查询出最大值

大概思路是 having count(分组聚合列) > all(SELECT count(分组聚合列)  FROM 表 group by 分组列)

select project_id 
from Project 
group by project_id 
having count(employee_id)>all(select count(employee_id) from Project group by Project.project_id)

ALL 会将外部查询中的值与子查询返回的所有值进行比较。

这里的>=all表示的是大于或者等于所有子查询的最大值,>=包括了最大值的项目,而>则不包括。可以返回所有的最大值,相比优化1逻辑更清晰,而且代码构成简单。在进行外部条件和子查询进行全局对比时,all函数很重要


http://www.mrgr.cn/news/63566.html

相关文章:

  • 文本列的性能优化?深入Oracle全文索引
  • 【清润模胶条】行业调研:前五大厂商份额占比超过60%
  • C++学习笔记3——存储持续性、作用域和链接性
  • 【分布式技术】分布式事务深入理解
  • Paperless-ngx:提升无纸化文档管理效率与安全性
  • 人才与金融科技双向奔赴,2024 深圳国际金融科技大赛校园行圆满结束
  • 品牌怎么找到用户发的优质内容,进行加热、复制?
  • YOLO——yolo v4(1)
  • 修改Windows远程桌面3389端口
  • 1008:计算(a+b)/c的值
  • 【视频】OpenCV:识别颜色、绘制轮廓
  • 文本文件、二进制文件常见格式
  • 【分立元件】贴片电阻过电压故障机理
  • 【BUG分析】clickhouse表final成功,但存在数据未合并
  • Java: 遍历 Map
  • 优化宝典:数据库性能提升指南
  • 脉冲当量计算方法
  • HJ53 杨辉三角的变形
  • Java 21 新特性来支持并发编程
  • 2024 年 11 月 1 日 deepin 23 内测更新公告
  • 大厂面试真题-很多系统会使用netty进行长连接,连接太多会有问题吗
  • 关于方法的定义上面有无static的对比
  • 算法笔记()
  • Android面试八股文
  • 用Python脚本执行安卓打包任务
  • 若依-侧边栏开关按钮禁用,侧边栏始终保持展开