- 🧮 通用聚合函数
这是最常用的一类,用于常规的数据汇总。PostgreSQL不仅支持SQL标准函数,还提供了一些特有的高级函数。
| 函数 | 描述 | 示例 |
|---|---|---|
| COUNT() | 返回输入行的数量 | SELECT COUNT(*) FROM orders; |
| SUM() | 计算一组数值的总和 | SELECT SUM(amount) FROM payments; |
| AVG() | 计算所有非空输入值的平均值 | SELECT AVG(salary) FROM employees; |
| MAX() | 返回一组值中的最大值 | SELECT MAX(price) FROM products; |
| MIN() | 返回一组值中的最小值 | SELECT MIN(price) FROM products; |
| ARRAY_AGG() | 将输入值(包括NULL)聚合到一个数组中 | SELECT ARRAY_AGG(name) FROM students; 返回 {'Alice', 'Bob', 'Charlie'} |
| STRING_AGG() | 指定分隔符,将多个字符串聚合成一个 | SELECT STRING_AGG(product_name, ', ') FROM products; 返回 'Laptop, Mouse, Keyboard' |
| JSON_AGG() | 将输入值聚合成一个JSON数组 | SELECT JSON_AGG(data) FROM logs; |
| JSONB_AGG() | 与JSON_AGG()类似,但输出为jsonb类型,处理效率更高 | SELECT JSONB_AGG(data) FROM logs; |
| JSON_OBJECT_AGG() | 将键/值对聚合成一个JSON对象 | SELECT JSON_OBJECT_AGG(id, name) FROM users; |
| JSONB_OBJECT_AGG() | 与JSON_OBJECT_AGG()类似,但输出为jsonb类型 | SELECT JSONB_OBJECT_AGG(id, name) FROM users; |
| BOOL_AND() | 如果所有输入值均为真,则返回真 | SELECT BOOL_AND(is_active) FROM sessions; |
| BOOL_OR() | 如果任一输入值为真,则返回真 | SELECT BOOL_OR(is_admin) FROM users; |
| BIT_AND() | 对所有非空输入值执行按位与(AND)操作 | SELECT BIT_AND(flags) FROM permissions; |
| BIT_OR() | 对所有非空输入值执行按位或(OR)操作 | SELECT BIT_OR(flags) FROM permissions; |
| BIT_XOR() | 对所有非空输入值执行按位异或(XOR)操作 | SELECT BIT_XOR(flags) FROM permissions; |
| EVERY() | BOOL_AND()的SQL标准等效写法 | SELECT EVERY(is_active) FROM sessions; |
| ANY_VALUE() | 从非空输入值中返回任意一个值,适用于不确定选择哪个值的场景 | SELECT ANY_VALUE(city) FROM addresses GROUP BY state; |
- 📈 统计聚合函数
用于执行基本的统计分析,非常适合数据探索。
| 函数 | 描述 | 示例 |
|---|---|---|
| STDDEV() / STDDEV_SAMP() | 计算输入值的样本标准差 | |
| STDDEV_POP() | 计算输入值的总体标准差 | |
| VARIANCE() / VAR_SAMP() | 计算输入值的样本方差 | |
| VAR_POP() | 计算输入值的总体方差 | |
| CORR() | 计算一对数值的相关系数 | |
| COVAR_SAMP() | 计算一对数值的样本协方差 | |
| COVAR_POP() | 计算一对数值的总体协方差 | |
| REGR_SLOPE() | 计算线性回归的斜率 |
请注意:此列表并未涵盖所有统计函数,完整的列表请参考官方文档。https://postgresql.ac.cn/docs/current/functions-aggregate.html#FUNCTIONS-AGGREGATE-STATISTICS-TABLE
- 🎯 有序集聚合函数
这类函数非常强大,其计算依赖于数据的特定顺序。它们通过 WITHIN GROUP (ORDER BY ...) 子句来指定排序。
| 函数 | 描述 | 示例 |
|---|---|---|
| PERCENTILE_CONT() | 返回基于连续分布的百分位数,结果会是小数或介于两个值之间 | SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY score) FROM exam_results; 这将返回分数的中位数。 |
| PERCENTILE_DISC() | 返回一个离散的百分位数,结果必定是数据集中的某个现有值 | SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY score) FROM exam_results; |
| MODE() | 返回一组数据中出现频率最高的值 | SELECT MODE() WITHIN GROUP (ORDER BY product_id) FROM sales; |
| RANK() | ||
| DENSE_RANK() |
- 💡 假设集聚合函数
这类函数用于评估如果某个"假设"的值被加入到数据集中,它会处于什么位置。它们也使用 WITHIN GROUP 子句。
| 函数 | 描述 | 示例 |
|---|---|---|
| RANK() | 计算一个假设值在排序后的分组中的排名(有间隔) | |
| DENSE_RANK() | 计算一个假设值在排序后的分组中的排名(无间隔) | |
| PERCENT_RANK() | 计算一个假设值的相对排名((rank - 1) / (total rows - 1)) | |
| CUME_DIST() | 计算一个假设值的累积分布(小于等于该值的行数占比) |
请注意:在聚合函数语境下,RANK() 等窗口函数的行为与在 OVER 子句中不同,它们需要 WITHIN GROUP 子句来定义排序。