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

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;

逻辑说明:

  1. 子查询latest通过GROUP BY Organisation ID分组,用MAX(Report Year)得到每个机构的最新报告年份。
  2. 将子查询结果与原reports表关联,匹配机构ID和最新年份,精准定位到每个机构的最新年度报告记录。
  3. 通过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;

逻辑说明:

  1. 用WITH子句创建临时表ranked_reports,通过ROW_NUMBER()窗口函数按机构分组,按报告年份降序给每条记录排名。
  2. 筛选排名为1的记录,就是每个机构的最新年度报告。
  3. 最后关联report_files表拿到对应文件即可。

注意事项

  • 如果同一个机构在同一年有多个报告记录,方法一会返回所有同年度的记录;方法二默认只返回一条(可通过调整ORDER BY字段,比如加上ID DESC来取最新创建的那条)。
  • 如果report_files中一个报告对应多个文件,查询结果会返回多条,可根据需求添加GROUP BY或DISTINCT去重,或者通过Report Type ID筛选特定类型的文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:20:11