You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:04:26