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

MySQL 8.0按SubjectId/MarksId分组获取最新记录问题

问题分析

原SQL的核心问题在于:

  • 子查询里的ORDER BY COALESCE(UPDATEDATE,ENTRYDATE) desc完全无效,GROUP BY执行后的排序不会改变MAX(Id)的选取逻辑
  • 用MAX(Id)代表“最新记录”逻辑不成立,Id最大不代表时间最新,和需求的按时间排序完全不匹配
正确解决方案(MySQL 8.0)

利用MySQL 8.0支持的窗口函数ROW_NUMBER(),可以精准实现按时间取每组最新记录的需求:

SELECT Id, SubjectId, marksid
FROM (
    SELECT 
        Id, 
        SubjectId, 
        marksid,
        ROW_NUMBER() OVER (
            PARTITION BY SubjectId, marksid 
            ORDER BY COALESCE(UPDATEDATE, ENTRYDATE) DESC
        ) AS row_num
    FROM student
) t
WHERE row_num = 1;
逻辑说明
  • PARTITION BY SubjectId, marksid:按学科和分数ID分组,确保每组单独处理
  • ORDER BY COALESCE(UPDATEDATE, ENTRYDATE) DESC:每组内优先按UPDATEDATE降序排序,若该字段为空则用ENTRYDATE降序,保证最新时间的记录排在最前
  • ROW_NUMBER()给每组内的记录按上述规则编号,取row_num=1就是每组的最新记录,完美覆盖两种场景:
    • 存在UPDATEDATE的记录会优先被选中
    • 所有记录UPDATEDATE为空时,自动选取ENTRYDATE最新的记录

内容的提问来源于stack exchange,提问作者Tech Travellers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:15:42