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
相关推荐
roman_日积跬步-终至千里5 分钟前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科5 分钟前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦26 分钟前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
晚霞的不甘2 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位2 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
海奥华22 小时前
mysql索引
数据库·mysql
2601_949593653 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__3 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102163 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light3 小时前
MySQL相关问题
数据库·mysql