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
相关推荐
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G1 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备1 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远1 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
geovindu1 天前
sql: Transaction & Concurrency Patterns using postgresql 18
postgresql·数据库开发·数据库架构
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren1 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安1 天前
MySQL-触发器
数据库·mysql
白远山1 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro1 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理