PostgreSQL GROUP BY 分组聚合教程
GROUP BY 把数据按 一个或多个列分组,配合聚合函数做统计,再用 HAVING 对分组结果过滤。
本篇内容
- GROUP BY 单列与多列分组
- 常用聚合函数(COUNT / SUM / AVG / MAX / MIN)
- HAVING:对分组后的结果过滤
- 与 WHERE 的分工和执行顺序
基本分组统计
-- 每个状态的用户数量
SELECT status, COUNT(*) AS cnt
FROM users
GROUP BY status;
-- 多列分组:按状态和城市分别统计
SELECT status, city, COUNT(*) AS cnt
FROM users
GROUP BY status, city;
HAVING
WHERE 在分组前过滤行,HAVING 在分组后过滤分组:
-- 只保留订单数超过 10 个的用户
SELECT user_id, COUNT(*) AS order_cnt
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 10;
-- WHERE + HAVING 组合:先过滤今年订单,再筛出高频用户
SELECT user_id, COUNT(*) AS order_cnt
FROM orders
WHERE created_at >= '2025-01-01'
GROUP BY user_id
HAVING COUNT(*) >= 5;
待补充(TODO)
- 补充:GROUP BY 严格校验规则(SELECT 中的非聚合列必须出现在分组键中)
- 补充:GROUPING SETS / ROLLUP / CUBE 的多维汇总写法
- 补充:聚合函数与 NULL 的行为(COUNT(col) 跳过 NULL、SUM 全 NULL 返回 NULL)
- 补充:分组统计与窗口函数的选型(需要明细时用窗口函数)