SQL如何计算分组查询所得各组最小值的平均值
问题原因
你写的SELECT AVG(MIN(price)) FROM Products GROUP BY category无法执行,核心原因是SQL不支持在同一查询层级直接嵌套聚合函数:单层GROUP BY的聚合粒度是商品分类,同一层级下无法对已经按分类聚合出的最小值再做跨分组的平均值计算。
可行实现方案
方案1:子查询嵌套(全数据库版本通用)
先通过子查询完成第一层按分类求最小值的聚合,再在外层对所有分组的最小值求平均,写法兼容所有支持SQL标准的数据库:
SELECT AVG(min_price) AS avg_category_min_price FROM ( SELECT MIN(price) AS min_price FROM Products GROUP BY category ) AS t_category_min;
方案2:CTE公用表达式(高版本数据库支持,可读性更强)
如果你的数据库支持CTE语法(MySQL 8.0及以上、PostgreSQL、SQL Server、Oracle 12c及以上等),可以用CTE拆分聚合逻辑,代码可读性更好:
WITH category_min_price AS ( SELECT MIN(price) AS min_price FROM Products GROUP BY category ) SELECT AVG(min_price) AS avg_category_min_price FROM category_min_price;
注意事项
- 如果某个分类下所有商品的
price字段均为NULL,该分类的MIN(price)返回值为NULL,AVG函数计算时会自动忽略这类NULL值 - 如果需要把无有效价格的分类纳入计算(比如按最小值0统计),可以调整内层聚合逻辑为
MIN(COALESCE(price, 0)),按实际业务需求调整即可。
内容的提问来源于stack exchange,提问作者g10k
相关产品推荐
相关产品推荐

