MySQL:GROUP BY子句基于最大日期取字段值及分组统计最高分学生问题
MySQL分组统计与取最大日期对应字段的解决方案
我来帮你搞定这两个MySQL查询的问题,咱们一步步来拆解~
一、统计每种type的数量,并获取各分组得分最高的学生姓名
很多同学一开始会尝试直接用GROUP BY type搭配MAX(score)来写,但这种写法要么会触发ONLY_FULL_GROUP_BY报错,要么返回的学生姓名和最高分不匹配(因为MySQL会随机选取非聚合字段的值)。这里推荐用窗口函数来精准实现需求:
假设你的表名为student_scores,字段包括type、name、score,可以这样写:
SELECT type, COUNT(*) AS type_count, name AS top_student, score AS highest_score FROM ( SELECT type, name, score, -- 按type分组,分数降序排名,每个组的第一条就是最高分 ROW_NUMBER() OVER (PARTITION BY type ORDER BY score DESC) AS rank_num FROM student_scores ) ranked_students WHERE rank_num = 1 GROUP BY type, name, score;
补充说明:
- 如果存在多个学生同分且都是该组最高分的情况,想要把这些学生都列出来,把
ROW_NUMBER()换成RANK()即可(RANK()会给同分的记录相同排名)。 - 如果你用的是MySQL 5.7及以下版本(不支持窗口函数),可以用关联子查询实现:
SELECT s1.type, COUNT(*) AS type_count, s1.name AS top_student, s1.score AS highest_score FROM student_scores s1 INNER JOIN ( SELECT type, MAX(score) AS max_score FROM student_scores GROUP BY type ) s2 ON s1.type = s2.type AND s1.score = s2.max_score GROUP BY s1.type, s1.name, s1.score;
二、GROUP BY子句中基于最大日期获取字段的值
要实现“按分组取最大日期对应的字段值”,同样不建议直接GROUP BY后硬选字段,这里给你两种常用的可靠写法:
方法1:窗口函数法(MySQL 8.0+推荐)
假设表名为your_table,字段包括type、target_field(你要获取的字段)、date_column(日期字段):
SELECT type, target_field, date_column AS latest_date FROM ( SELECT type, target_field, date_column, -- 按type分组,日期降序排名,第一条就是最新记录 ROW_NUMBER() OVER (PARTITION BY type ORDER BY date_column DESC) AS rank_num FROM your_table ) latest_records WHERE rank_num = 1;
方法2:关联子查询法(兼容低版本MySQL)
SELECT t1.type, t1.target_field, t1.date_column AS latest_date FROM your_table t1 INNER JOIN ( -- 先获取每个type的最大日期 SELECT type, MAX(date_column) AS max_date FROM your_table GROUP BY type ) t2 ON t1.type = t2.type AND t1.date_column = t2.max_date;
补充说明:
- 如果同一个
type下有多个记录的日期等于最大日期,关联子查询会返回所有匹配的记录;如果只想返回其中一条,可以在子查询里加额外排序条件(比如主键降序)。
内容的提问来源于stack exchange,提问作者Navid_pdp11
相关产品推荐
相关产品推荐

