跳到主要内容

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)
  • 补充:分组统计与窗口函数的选型(需要明细时用窗口函数)