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
相关推荐
oradh1 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789862 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD2 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward3 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记4 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发4 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB4 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
欲速不达88204 小时前
Mysql并发DML锁等待的优化
数据库·mysql
Database_Cool_5 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云
会编程的土豆5 小时前
数据库范式
数据库·oracle