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

相关推荐
像风一样自由20205 分钟前
13.pgvector入门用PostgreSQL直接实现向量检
人工智能·postgresql·大模型·rag·智能体
JavaPub-rodert8 分钟前
Ontop 详解:不搬数据库,也能把 MySQL / PostgreSQL 变成知识图谱
数据库·mysql·postgresql
xiaoxiang960931 分钟前
Git 分支同步实战:`merge -X theirs` 与完全合并方案
数据库·git·elasticsearch
GoppViper1 小时前
用户测试如何提升SEO转化率?四种实操方法与案例解析
数据库·经验分享
先吃饱再说1 小时前
后端开发绕不开的 SQL:从建表、查询到索引优化,一篇讲透
数据库·后端·sql
敲代码的小小酥2 小时前
InfluxDB时序数据库(续)
数据库·时序数据库
智购科技自动贩卖机2 小时前
自动售货机嵌入式系统Go语言开发实践:从资源受限设备到RTOS协程调度的工程化之路
大数据·linux·数据库·人工智能·yolo·架构·golang
SelectDB2 小时前
2026 年 Apache Doris 和 StarRocks 怎么选?一篇更接近真实选型的对比
大数据·数据库·数据分析
祢真伟大2 小时前
DM8 归档日志挖掘导致 TEMP 表空间不释放的问题排查
数据库
qq_485015212 小时前
MyBatis-Plus 3.x FieldStrategy 作用
java·数据库·mybatis