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
相关推荐
樹JUMP9 分钟前
Python虚拟环境(venv)完全指南:隔离项目依赖
jvm·数据库·python
用什么都重名12 分钟前
Redis 入门与实践:从基础到 Stream 消息队列
数据库·redis·缓存
Mistra丶16 分钟前
记一次 JVM+Postgresql的 “死锁” 问题排查
jvm·数据库·postgresql·死锁
一然明月17 分钟前
Qt QML 锚定(Anchors)全解析
java·数据库·qt
分享牛35 分钟前
Operaton入门到精通23-Operaton 2.0 原生支持 JUnit 6 核心指南
数据库·junit
编码忘我1 小时前
mysq系列之事务
数据库
知识分享小能手1 小时前
Redis入门学习教程,从入门到精通,Redis进阶编程知识点详解(5)
数据库·redis·学习
MekoLi291 小时前
MongoDB 新手完全指南:从入门到精通的实战手册
数据库·后端
cyforkk1 小时前
Spring AOP 进阶:揭秘 @annotation 参数绑定的底层逻辑
java·数据库·spring
2401_884970611 小时前
用Pygame开发你的第一个小游戏
jvm·数据库·python