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

相关推荐
资深数据库专家2 小时前
总账EBS 应用服务器1 的监控分析
java·网络·数据库
m0_678485452 小时前
CSS如何控制表格单元格边框合并_通过border-collapse实现
jvm·数据库·python
m0_748839492 小时前
如何用组合继承模式实现父类方法复用与子类属性独立
jvm·数据库·python
qq_334563553 小时前
PHP源码是否依赖特定芯片组_Intel与AMD平台差异【操作】
jvm·数据库·python
qq_206901393 小时前
如何使用C#调用Oracle存储过程_OracleCommand配置CommandType.StoredProcedure
jvm·数据库·python
m0_748839493 小时前
CSS如何实现元素平滑滚动_使用scroll-behavior属性设置
jvm·数据库·python
星晨雪海4 小时前
Lombok 注解使用场景终极总结
java·数据库·mysql
风子杨yxf7715 小时前
linux下oracle开机自启动以及关机自关闭数据库,并发送邮件通知
linux·运维·数据库·oracle·自启动·发邮件·自关闭
战族狼魂5 小时前
基于LibreOffice +python 实现一个小型销售管理系统的数据库原型教学实验
数据库·python