在SQL查询中,统计每个分组内的最高值和最低值是常见的数据分析需求。通过GROUP BY结合MAX与MIN聚合函数,我们可以快速得到按指定字段分组后的极值结果,适用于报表统计、异常值排查等场景。

基础用法:GROUP BY配合MAX和MIN
假设有一张销售记录表sales,包含字段region(地区)、amount(销售额)。要统计每个地区的最高与最低销售额,可以使用如下语句:
SELECT region, MAX(amount) AS max_amount, MIN(amount) AS min_amount FROM sales GROUP BY region;
上述查询会按region分组,并返回每组中amount的最大值和最小值。MAX函数忽略NULL值,若组内全为NULL则返回NULL。
带筛选条件的分组极值
如果只关心销售额大于100的分组情况,可以在WHERE中过滤,或用HAVING对聚合结果筛选:
SELECT region, MAX(amount) AS max_amount, MIN(amount) AS min_amount FROM sales WHERE amount > 0 GROUP BY region HAVING MAX(amount) > 1000;
同时获取极值对应的其他字段
有时不仅要知道最高值,还要拿到产生该值的记录信息。普通聚合无法直接返回整行,可改用窗口函数:
SELECT region, amount, MAX(amount) OVER (PARTITION BY region) AS max_amount, MIN(amount) OVER (PARTITION BY region) AS min_amount FROM sales;
该写法不为结果集去重,而是为每一行附加本组极值,便于后续定位具体记录。
常见注意事项
- MAX和MIN支持数值、字符串和日期类型,字符串按排序规则比较。
- GROUP BY后的字段必须出现在SELECT中(聚合函数除外)。
- 对NULL的处理:聚合时NULL不参与比较,但空组若无数据则返回无此组。
在性能方面,为分组字段和聚合字段建立合适索引,能显著加快GROUP BY执行速度。
小结
使用MAX与MIN统计分组内最高和最低值,核心在于理解GROUP BY的分组逻辑。简单统计直接用聚合加分组即可,需要保留明细时采用窗口函数。掌握这两种写法能够覆盖绝大多数业务查询场景。