技术文摘
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分组 取字段最大值
- 怎样按照Type关联的Blog数量进行排序
- MySQL 使用 Update Left Join 结合子查询更新特定字段为多条数据中的最大值
- Druid连接超时提示discard long time none received connection的原因
- 索引建立顺序如何影响查询速度:相同数据不同索引顺序下查询速度有无差异
- 理解与解决 Druid 连接超时警告
- .NET Core 项目迁移至阿里云 RDS MySQL,仅改连接字符串是否可行
- 数据库索引建立顺序对查询速度有何影响
- MySQL 统计解析失败率的方法
- MySQL表自动增量突变为10000且无法修改的原因
- MySQL自动增量突变为10000该怎么解决
- 怎样高效实现坐标轨迹在数据库中的持久化
- Linux部署后Druid连接超时警告:问题还是正常现象
- MySQL 如何统计各监测对象的解析失败率
- 怎样通过 left join 将 student 表的 score 字段更新为 score 表中的最大值
- 怎样借助事务与 FOR UPDATE 达成数据库队列任务并发执行的锁机制