PostgreSql 常用聚合函数

基础准备

sql 复制代码
CREATE TEMP TABLE demo(id int, v int, t text);
INSERT INTO demo VALUES
  (1, 10, 'a'),
  (2, 20, 'b'),
  (3, NULL, 'c');
id v t
1 10 a
2 20 b
3 NULL c

注意:版本基于 PG 15,全部自带,无需扩展

A. 基础统计
sql 复制代码
SELECT count(*)        AS cnt,      -- 3
       count(v)        AS cnt_v,    -- 2(NULL 不计)
       sum(v)          AS s,        -- 30
       avg(v)          AS a,        -- 15
       max(v)          AS mx,       -- 20
       min(v)          AS mn        -- 10
FROM demo;

结果:

cnt cnt_v s a mx mn
3 2 30 15 20 10

B. 扩展统计

sql 复制代码
SELECT stddev_pop(v)   AS std_pop,   -- 5
       stddev_samp(v)  AS std_samp,  -- 7.0710678
       var_pop(v)      AS var_pop,   -- 25
       var_samp(v)     AS var_samp   -- 50
FROM demo;

结果:

std_pop std_samp var_pop var_samp
5 7.07106781 25 50
C. 位运算聚合
sql 复制代码
SELECT bit_and(v)      AS bit_and,   -- 0  (10 & 20 = 0)
       bit_or(v)       AS bit_or,    -- 30 (10 | 20 = 30)
       bit_xor(v)      AS bit_xor    -- 30 (10 # 20 = 30)
FROM demo;

结果:

bit_and bit_or bit_xor
0 30 30
D. 字符串聚合
sql 复制代码
SELECT string_agg(t, ',')            AS str1,  -- a,b,c
       string_agg(t, ',' ORDER BY id DESC) AS str2  -- c,b,a
FROM demo;

结果:

str1 str2
a,b,c c,b,a
E. 数组 / JSON 聚合
sql 复制代码
SELECT array_agg(v)               AS arr,        -- {10,20}
       array_agg(v ORDER BY v DESC) AS arr_desc, -- {20,10}
       json_agg(v)                AS j,          -- [10,20]
       jsonb_agg(t)               AS jb          -- ["a", "b", "c"]
FROM demo;

结果:

arr arr_desc j jb
{10,20} {20,10} 10,20 "a", "b", "c"
F. 排重聚合
sql 复制代码
SELECT count(DISTINCT v)     AS cdv,  -- 2
       string_agg(DISTINCT t, '') AS dst  -- abc
FROM demo;

结果:

cdv dst
2 abc
G. 有序集合(需要 WITHIN GROUP)
sql 复制代码
SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY v) AS median, -- 15
       percentile_disc(0.5) WITHIN GROUP (ORDER BY v) AS disc,   -- 10
       mode()              WITHIN GROUP (ORDER BY t)  AS mode_t  -- a(出现最多)
FROM demo;

结果:

median disc mode_t
15 10 a
H. 假设集合(同样 WITHIN GROUP)
sql 复制代码
SELECT rank(15)       WITHIN GROUP (ORDER BY v) AS rnk,  -- 2
       percent_rank(15) WITHIN GROUP (ORDER BY v) AS pct, -- 0.5
       cume_dist()      WITHIN GROUP (ORDER BY v) AS cume -- 1.0
FROM demo;

结果:

rnk pct cume
2 0.5 1.0
相关推荐
mN9B2uk175 分钟前
大数据量高并发的数据库优化
服务器·数据库·oracle
Database_Cool_8 分钟前
PolarSearch AutoETL:让数据库内置搜索不再需要搬运工
数据库
cui178756839 分钟前
物业费收缴困局的破题之路:2026年社区商业逻辑的底层重构
大数据·数据库·人工智能
是发财不是旺财1 小时前
Hermes 网关四层权限控制方案:让 AI Agent 安全地查数据库
数据库·安全·agent·openclaw·hermes
阿正的梦工坊1 小时前
【Rust】04-借用、引用与切片
java·数据库·rust
AOwhisky1 小时前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算
阿标在干嘛2 小时前
政策平台的推送系统:消息队列、定时任务、AB测试的工程实践
服务器·数据库·ab测试
Upsy-Daisy2 小时前
Hermes Agent 学习笔记 02:安装、配置与第一次运行
java·前端·数据库
Tongpao_SSDHDD2 小时前
希捷酷鹰ST6000VX008实测解析:中小安防监控高性价比存储方案
大数据·数据库·人工智能
蓝鸟19743 小时前
Oracle超大DMP备份文件瘦身、日志精简、磁盘空间优化实战方案日志
数据库·oracle·数据库运维·生产运维实战·oracle避坑·磁盘空间优化·oracle日志清理