MySQL使用GROUP BY查询各机构最新年度报告记录
解决每个机构最新年度报告记录的查询问题
要实现查询每个机构对应的最新年度报告记录并关联对应的文件,我们可以用两种常见的MySQL方案,具体如下:
方法一:使用GROUP BY子查询(兼容所有MySQL版本)
首先,我们需要先获取每个机构的最新报告年份,再通过这个年份匹配回原reports表找到对应的记录,最后关联report_files表拿到文件信息:
SELECT r.`Organisation ID`, r.`Report Year`, rf.`Report File` FROM reports r -- 子查询获取每个机构的最新报告年份 JOIN ( SELECT `Organisation ID`, MAX(`Report Year`) AS latest_year FROM reports GROUP BY `Organisation ID` ) latest ON r.`Organisation ID` = latest.`Organisation ID` AND r.`Report Year` = latest.latest_year -- 关联报告文件表,匹配对应的报告记录 LEFT JOIN report_files rf ON r.ID = rf.`Report ID` -- 可选:如果需要筛选特定类型的报告,添加Report Type ID条件 -- WHERE rf.`Report Type ID` = 1;
逻辑说明:
- 子查询
latest通过GROUP BY Organisation ID分组,用MAX(Report Year)得到每个机构的最新报告年份。 - 将子查询结果与原
reports表关联,匹配机构ID和最新年份,精准定位到每个机构的最新年度报告记录。 - 通过
LEFT JOIN关联report_files表,确保即使某个机构最新年度没有对应文件,也能保留机构的基础记录(如果必须要求有文件,可改为INNER JOIN)。
方法二:使用窗口函数(MySQL 8.0+版本支持)
如果你的MySQL版本是8.0及以上,用窗口函数会更直观,尤其适合处理复杂的排序场景:
WITH ranked_reports AS ( SELECT *, -- 按机构分组,按报告年份降序排序,每组第一条标记为1 ROW_NUMBER() OVER (PARTITION BY `Organisation ID` ORDER BY `Report Year` DESC) AS rn FROM reports ) SELECT rr.`Organisation ID`, rr.`Report Year`, rf.`Report File` FROM ranked_reports rr LEFT JOIN report_files rf ON rr.ID = rf.`Report ID` -- 筛选每组的第一条(最新年度记录) WHERE rr.rn = 1;
逻辑说明:
- 用
WITH子句创建临时表ranked_reports,通过ROW_NUMBER()窗口函数按机构分组,按报告年份降序给每条记录排名。 - 筛选排名为1的记录,就是每个机构的最新年度报告。
- 最后关联
report_files表拿到对应文件即可。
注意事项
- 如果同一个机构在同一年有多个报告记录,方法一会返回所有同年度的记录;方法二默认只返回一条(可通过调整
ORDER BY字段,比如加上ID DESC来取最新创建的那条)。 - 如果
report_files中一个报告对应多个文件,查询结果会返回多条,可根据需求添加GROUP BY或DISTINCT去重,或者通过Report Type ID筛选特定类型的文件。
内容的提问来源于stack exchange,提问作者bharath
相关产品推荐
相关产品推荐

