PostgreSQL 聚合函数总览

  1. 🧮 通用聚合函数

这是最常用的一类,用于常规的数据汇总。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;
  1. 📈 统计聚合函数

用于执行基本的统计分析,非常适合数据探索。

函数 描述 示例
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

  1. 🎯 有序集聚合函数

这类函数非常强大,其计算依赖于数据的特定顺序。它们通过 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()
  1. 💡 假设集聚合函数

这类函数用于评估如果某个"假设"的值被加入到数据集中,它会处于什么位置。它们也使用 WITHIN GROUP 子句。

函数 描述 示例
RANK() 计算一个假设值在排序后的分组中的排名(有间隔)
DENSE_RANK() 计算一个假设值在排序后的分组中的排名(无间隔)
PERCENT_RANK() 计算一个假设值的相对排名((rank - 1) / (total rows - 1))
CUME_DIST() 计算一个假设值的累积分布(小于等于该值的行数占比)

请注意:在聚合函数语境下,RANK() 等窗口函数的行为与在 OVER 子句中不同,它们需要 WITHIN GROUP 子句来定义排序。

相关推荐
笃行35015 小时前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行35015 小时前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行35015 小时前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB2 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶2 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵2 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils2 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
Databend3 天前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
ClouGence4 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle