基础准备
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 |