MySQL按键列值分组获取最新日期的实现方案
MySQL 8.0 查询指定PO#下各子集最新日期记录方案
需求说明
查询指定PO编号下,每个采购单子集(subNo)对应的最新日期完整记录,包含id、date、subNo、poNo字段。
推荐方案1:窗口函数法(最可靠简洁)
利用MySQL 8.0支持的ROW_NUMBER()窗口函数,按子集分组并按日期降序排序,筛选每组第一条记录:
SELECT id, date, subNo, poNo FROM ( SELECT id, date, subNo, poNo, -- 按subNo分组,每组内按date降序编号 ROW_NUMBER() OVER (PARTITION BY subNo ORDER BY date DESC) AS rn FROM myTable WHERE poNo = '800' -- 替换为目标PO编号 ) t WHERE rn = 1; -- 筛选每组最新的第一条记录
推荐方案2:关联子查询法
先通过子查询获取每个子集的最新日期,再关联原表匹配完整记录:
SELECT m.id, m.date, m.subNo, m.poNo FROM myTable m INNER JOIN ( -- 先拿到指定PO下每个subNo的最新日期 SELECT subNo, MAX(date) AS max_date FROM myTable WHERE poNo = '800' GROUP BY subNo ) s ON m.subNo = s.subNo AND m.date = s.max_date AND m.poNo = '800'; -- 限定PO编号,避免跨PO匹配
针对你遇到的问题说明
- GROUP BY失效:直接用
GROUP BY subNo只能聚合出最大日期,但无法保证对应返回的id等其他字段是最新日期的那条记录(非ONLY_FULL_GROUP_BY模式下会返回随机行,开启该模式则直接报错)。 - 表关联报错“Unknown column 's' in where clause”:通常是因为把子查询别名的关联条件写在了
WHERE子句中,而非JOIN的ON子句里,导致别名作用域不生效。上述关联写法将条件放在ON中,可避免此问题。
内容的提问来源于stack exchange,提问作者Jörg
相关产品推荐
相关产品推荐

