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

Access中含3列的SQL MIN函数查询问题

Access SQL中MIN()函数结合ID列的解决方案

我太懂你遇到的这个问题了!当你在查询里加入ID列后返回全表数据,核心原因是Access的GROUP BY规则:所有出现在SELECT子句里的非聚合函数字段,必须同时出现在GROUP BY子句中。而ID作为主键(通常是唯一值),一旦加入GROUP BY,每个ID都会成为独立分组,自然就返回了原表的所有行。

要实现“按FIELD_1分组取最小FIELD_2对应的完整行(包含ID和其他列)”,有两种常用的解决方法:

方法1:子查询关联法(推荐)

先通过子查询获取每个FIELD_1分组的最小FIELD_2值,再将原表与这个子查询关联,匹配对应的分组和最小值,从而拿到完整的行数据:

SELECT t.ID, t.FIELD_1, t.FIELD_2, t.FIELD_3
FROM [TABLE] t
INNER JOIN (
    SELECT FIELD_1, MIN(FIELD_2) AS Min_FIELD_2
    FROM [TABLE]
    GROUP BY FIELD_1
) sub_query 
    ON t.FIELD_1 = sub_query.FIELD_1 
    AND t.FIELD_2 = sub_query.Min_FIELD_2;

说明:

  • 子查询sub_query负责计算每个FIELD_1对应的最小FIELD_2值
  • 主查询通过INNER JOIN匹配原表中FIELD_1相同且FIELD_2等于最小值的行,这样就能拿到对应的ID和其他列
  • 如果同一个FIELD_1分组下有多行的FIELD_2等于最小值,这个语句会返回所有符合条件的行

方法2:相关子查询法

用相关子查询直接判断当前行的FIELD_2是否为对应FIELD_1分组的最小值:

SELECT t.ID, t.FIELD_1, t.FIELD_2, t.FIELD_3
FROM [TABLE] t
WHERE t.FIELD_2 = (
    SELECT MIN(FIELD_2)
    FROM [TABLE]
    WHERE FIELD_1 = t.FIELD_1
);

说明:

  • 这个写法更直观,每一行都会触发一次子查询,检查自己的FIELD_2是不是所属FIELD_1分组的最小值
  • 和方法1一样,如果有多个行符合最小值条件,会全部返回;如果只需要唯一结果,可以结合DISTINCT或者添加ID的排序条件(比如取最小ID)

额外注意事项

  • 确保FIELD_2是可以使用MIN()函数的数据类型(比如数字、日期),如果是文本类型,MIN()会按字典序取值,可能不符合你的预期
  • 如果你的表名是Access的保留字(比如TABLE),记得用方括号[]把表名括起来,避免语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:12:58