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 子句来定义排序。

相关推荐
码出钞能力29 分钟前
apache-shardingsphere-5.5.3自定义分片算法
数据库
兜有米啦1 小时前
数据库第二次作业
数据库
nVisual2 小时前
机柜PDU安装位置与空间建模方案
大数据·网络·数据库·信息可视化·数据中心基础设施管理
weixin_6682 小时前
Cursor-superpowers插件用法
数据库·人工智能
NWU_白杨2 小时前
三种常用的数据存储技术
数据库·redis·mysql·sqlite
吃饱了得干活2 小时前
亿级订单表分库分表设计,从0到1全流程
java·数据库·面试
蓝创工坊Blue Foundry2 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
麦聪聊数据2 小时前
企业数据市场建设(三):API 化服务封装,让数据开箱即用、避免重复开发
数据库
脱胎换骨-军哥3 小时前
C++数据库存储引擎内核开发:B+树索引与MVCC并发控制的完整实现
数据库·c++·b树
麦聪聊数据3 小时前
企业数据市场建设(四):流程闭环与价值运营,让数据市场真正转起来
运维·数据库