聚合函数
聚合函数将一组输入行归约为一个结果;GROUP BY 决定分组,不写时整个输入是一个组。WHERE 先过滤行,HAVING 再过滤组。
计数与数值汇总
SELECT customer_id,
count(*) AS rows_count,
count(amount) AS non_null_amounts,
sum(amount) AS total,
avg(amount) AS mean
FROM orders
GROUP BY customer_id
HAVING count(*) >= 2;
count(*) 统计行,count(expression) 忽略表达式结果为 NULL 的行,count(DISTINCT expression) 统计不同的非空值。sum、avg、min、max 通常忽略 NULL;空输入上 count 为 0,其他常见聚合返回 NULL,需要 0 时显式 coalesce(sum(amount), 0)。avg(integer) 并不是整数除法,返回类型需按输入类型核对。
每个聚合单独筛选与排序
SELECT count(*) AS all_orders,
count(*) FILTER (WHERE status = 'paid') AS paid_orders,
string_agg(status, ', ' ORDER BY created_at, id) AS statuses
FROM orders;
FILTER 只影响该聚合,DISTINCT 用于聚合前去重。string_agg、array_agg、jsonb_agg 等顺序敏感聚合若不在调用内部明确 ORDER BY,元素顺序不可靠;输入没有行时它们通常返回 NULL,不是空数组或空字符串。
布尔、统计与有序集合
bool_and 要求所有非空布尔值为真,bool_or 只需一个为真;stddev_samp、variance 等用于统计估计。percentile_cont(0.5) WITHIN GROUP (ORDER BY amount) 计算连续百分位数(可能插值);percentile_disc 从实际输入值中选。mode() WITHIN GROUP (ORDER BY amount) 求众数。聚合中排序、去重、分组会增加成本,先明确计算目标再检查执行计划;不要靠 ORDER BY 在聚合外层控制 array_agg 的内部顺序。