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
相关产品推荐
相关产品推荐

