技术文摘
MySQL GROUP BY分组取字段最大值示例代码详情
MySQL GROUP BY分组取字段最大值示例代码详情
在MySQL数据库的实际应用中,经常会遇到需要按照某一字段进行分组,并获取每组中另一个字段最大值的需求。下面就通过示例代码详细介绍这一操作的实现方法。
创建一个示例表。假设我们有一个存储学生考试成绩的表 student_scores,包含字段 id(学生ID,主键)、student_name(学生姓名)、subject(考试科目)和 score(考试成绩)。创建表的SQL语句如下:
CREATE TABLE student_scores (
id INT AUTO_INCREMENT PRIMARY KEY,
student_name VARCHAR(50),
subject VARCHAR(50),
score INT
);
接着,插入一些测试数据:
INSERT INTO student_scores (student_name, subject, score) VALUES
('张三', '数学', 85),
('张三', '英语', 90),
('李四', '数学', 92),
('李四', '英语', 88);
现在,我们要获取每个学生的最高成绩。这就需要使用 GROUP BY 结合聚合函数来实现。
方法一:使用子查询。先通过子查询获取每个学生的最高成绩,然后再与原表进行连接查询。
SELECT s.student_name, sub.max_score
FROM (
SELECT student_name, MAX(score) AS max_score
FROM student_scores
GROUP BY student_name
) AS sub
JOIN student_scores s ON s.student_name = sub.student_name AND s.score = sub.max_score;
在这个查询中,子查询部分 SELECT student_name, MAX(score) AS max_score FROM student_scores GROUP BY student_name 首先按照学生姓名分组,求出每个学生的最高成绩。然后主查询通过连接条件将子查询结果与原表连接起来,获取对应的学生姓名和最高成绩。
方法二:使用 ROW_NUMBER() 窗口函数。
WITH ranked_scores AS (
SELECT
student_name,
score,
ROW_NUMBER() OVER (PARTITION BY student_name ORDER BY score DESC) AS rank
FROM student_scores
)
SELECT student_name, score
FROM ranked_scores
WHERE rank = 1;
这里使用 WITH 子句创建了一个名为 ranked_scores 的临时结果集。在这个临时结果集中,通过 ROW_NUMBER() 窗口函数按照学生姓名分区,并按照成绩降序排列,给每个学生的成绩分配一个排名。最后在主查询中筛选出排名为1的记录,即每个学生的最高成绩。
通过以上示例代码,我们详细展示了在MySQL中实现GROUP BY分组取字段最大值的不同方法,开发者可根据实际情况选择合适的方案。
TAGS: 示例代码 MySQL MySQL_GROUP_BY分组 取字段最大值
- 这 10 个编程错误易致程序故障,你避开了吗?
- 巧用OnionScan自制暗网爬虫
- 王者之位稳固:Java 和 C 持续领衔热门编程语言
- JavaScript 内部人士透露其未来走向
- 基于 ES6 新特性 Proxy 打造数据绑定实例
- 未学 C 语言的后果
- 三大 JS 框架的竞争:Angular.js、React.js 和 Ember.js
- AlloyFinger:超小 Web 手势库的原理
- 初探 Angular 2 端到端测试
- JavaScript 客户端 APP 保护的最优之法
- 云领未来 OpenStack 应从行业入手
- Web 应用数据流的思考
- 借助 Acorn 解析 JavaScript
- Nodejs基础之路径处理模块path总结
- TiDB:重新定义下一代关系型数据库的世界级开源项目