根據老師表(teacher),老師任課關系表(teacher2class),課程表(class),通過表連接,得到老師的任課結構表,如下:
select t.id, t.name, c.title from teacher t
left join teacher2class t2c on t.id = t2c.teacher_id
left join class c on t2c.class_id = c.id;

現希望根據老師分組,將老師認的課程聚合在一起,根據分組和聚合函數,修改SQL代碼,到的最終結果,如下:
select t.id, t.name, json_agg(c.title) from teacher t
left join teacher2class t2c on t.id = t2c.teacher_id
left join class c on t2c.class_id = c.id
group by t.id;

通用聚合函數
test=# select * from tb_test; -- 獲取通用聚合函數測試表格
id | name | sex
----+------+-----
1 | 張三 | m
2 | 李四 | m
3 | 王五 | f
| 函數 | 參數類型 | 返回類型 | 描述 | 示例 | 結果 |
|---|---|---|---|---|---|
| array_agg(expression) | 任意非數組類型 | 參數類型的數組 | 將入參包括NULL連接成一個數組 | select array_agg(id) from tbl_test; | {1,2,3} |
| array_agg(expression) | 任意數組類型 | 入參數據類型 | 將入參數組連接成更高維度的數組,輸入的數組必須是相同的維度,且不允許是空或NULL | select array_agg(array['b','c','a']); | {{b,c,a}} |
| avg(expression) | smallint, int, bigint, real, double precision, numeric, or interval | 整形返回numeric,浮點型返回double precision,其他和入參類型相同 | 平均值 | select avg(id) from tbl_test; | 2.0000000000000000 |
| bit_and(expression) | smallint, int, bigint, or bit | 和入參類型相同 | 所有非NULL輸入值的按位與,如果全為NULL則返回NULL | select bit_and(id) from tbl_test; | 0 |
| bit_or(expression) | smallint, int, bigint, or bit | 和入參類型相同 | 所有非NULL輸入值的按位或,如果全為NULL則返回NULL | select bit_or(id) from tbl_test; | 3 |
| bool_and(expression) | bool | bool | 如果輸入全是true則返回true,否則為false | select bool_or(id::bool) from tbl_test; | t |
| bool_or(expression) | bool | bool | 如果輸入至少一個true,則返回true,否則返回false | select bool_or((id-1)::bool) from tbl_test; | t |
| count(*) | bigint | 輸入行數 | select count(*) from tbl_test; | 3 | |
| count(expression) | any | bigint | 輸入行中非NULL的行數 | select count(id) from tbl_test; | 3 |
| every(expression) | bool | bool | 功能同bool_and | ||
| json_agg(expression) | any | json | 將輸入聚合成一個json數組 | select json_agg(id) from tbl_test; | [1, 2, 3] |
| jsonb_agg(expression) | any | jsonb | 將輸入聚合成一個json數組 | select jsonb_agg(id) from tbl_test; | [1, 2, 3] |
| json_object_agg(name,value) | (any, any) | json | 將輸入組成一個key/value對的json對象 | select json_object_agg('a','one'); | { "a" : "one" } |
| jsonb_object_agg(name,value) | (any, any) | jsonb | 將輸入組成一個key/value對的json對象 | select jsonb_object_agg('a','one'); | {"a": "one"} |
| max(expression) | 輸入最大值 | select max(id) from tbl_test; | 3 | ||
| min(expression) | 輸入最小值 | select min(id) from tbl_test; | 1 | ||
| string_agg(expression,delimiter) | (text, text) or (bytea, bytea) | 同參數類型 | 將輸入使用delimiter連接成一個text | select string_agg(name,',') from tbl_test; | 張三,李四,王五 |
| sum(expression) | smallint, int, bigint, real, double precision, numeric, interval, or money | 輸入和 | select sum(id) from tbl_test; | 6 | |
| xmlagg(expression) | xml | xml | 請參考xml類型及其函數 |
統計聚合函數
test=# select * from tbl_test; -- 獲取統計聚合函數的測試表格
id | name | sex | id1
----+------+-----+-----
1 | 張三 | m | 1
2 | 李四 | m | 1
3 | 王五 | f | 1
| 函數 | 參數類型 | 返回類型 | 描述 | 示例 | 結果 |
|---|---|---|---|---|---|
| corr(Y, X) | double precision | double precision | 相關系數 | select corr(id,id) from tbl_test; | 1 |
| covar_pop(Y, X) | double precision | double precision | 總體協方差 | select covar_pop(id,id) from tbl_test; | 0.666666666666667 |
| covar_samp(Y, X) | double precision | double precision | 樣本協方差 | select covar_samp(id,id1) from tbl_test; | 0 |
| regr_avgx(Y, X) | double precision | double precision | 自變量平均值(sum(X)/N) | select regr_avgx(id,id1) from tbl_test; | 1 |
| regr_avgy(Y, X) | double precision | double precision | 因變量平均值(sum(Y)/N) | select regr_avgy(id,id1) from tbl_test; | 2 |
| regr_count(Y, X) | double precision | bigint | 兩個參數都不為NULL的行數 | select regr_count(id,id1) from tbl_test; | 3 |
| regr_intercept(Y, X) | double precision | double precision | 根據所有輸入點(X,Y)利用最小二乘法計算一個線性方程式。然后返回該直線的Y軸截距 | select regr_intercept(id,id) from tbl_test; | 0 |
| regr_r2(Y, X) | double precision | double precision | 相關系數平方 | select regr_r2(id,id) from tbl_test; | 1 |
| regr_slope(Y, X) | double precision | double precision | 根據所有輸入點(X,Y)利用最小二乘法計算一個線性方程式。然后返回該直線的斜率 | select regr_slope(id,id) from tbl_test; | 1 |
| regr_sxx(Y, X) | double precision | double precision | sum(X^2) - sum(X)^2/N | select regr_sxx(id,id) from tbl_test; | 2 |
| regr_sxy(Y, X) | double precision | double precision | sum(X*Y) - sum(X) * sum(Y)/N | select regr_sxy(id,id) from tbl_test; | 2 |
| regr_syy(Y, X) | double precision | double precision | sum(Y^2) - sum(Y)^2/N | select regr_syy(id,id) from tbl_test; | 2 |
| stddev(expression) | smallint, int, bigint, real, double precision, or numeric | double precision for floating-point arguments, otherwise numeric | 同stddev_samp | ||
| stddev_pop(expression) | smallint, int, bigint, real, double precision, or numeric | double precision for floating-point arguments, otherwise numeric | 總體標准差 | select stddev_pop(id) from tbl_test; | 0.81649658092772603273 |
| stddev_samp(expression) | smallint, int, bigint, real, double precision, or numeric | double precision for floating-point arguments, otherwise numeric | 樣本標准差 | select stddev_samp(id) from tbl_test; | 1.00000000000000000000 |
| variance(expression) | smallint, int, bigint, real, double precision, or numeric | double precision for floating-point arguments, otherwise numeric | 同var_samp | ||
| var_pop(expression) | smallint, int, bigint, real, double precision, or numeric | double precision for floating-point arguments, otherwise numeric | 總體方差 | select var_pop(id) from tbl_test; | 0.66666666666666666667 |
| var_samp(expression) | smallint, int, bigint, real, double precision, or numeric | double precision for floating-point arguments, otherwise numeric | 樣本方差 | select var_samp(id) from tbl_test; | 1.00000000000000000000 |
順序集聚合函數
-- 獲取順序集聚合函數的測試表格
select * from tb_test;
id | name | sex | id1
-- --+------+-----+-----
1 | 張三 | m | 1
2 | 李四 | m | 1
3 | 王五 | f | 1
2 | ww | f | 1
| 函數 | 直接參數類型 | 聚合參數類型 | 返回類型 | 描述 | 示例 | 結果 |
|---|---|---|---|---|---|---|
| mode() WITHIN GROUP (ORDER BYsort_expression) | 任意可排序類型 | 同排序類型 | 返回最頻繁的輸入值(如果有多個同樣頻繁的結果,則返回第一個) | select mode() within group (order by id) from tbl_test; | 2 | |
| percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression) | double precision | double precisionor interval | 同排序類型 | 連續百分比:返回與指定順序中指定分數相對應的值,並在需要時在相鄰輸入項之間進行插值 | select percentile_cont(0.25) WITHIN GROUP (ORDER BY id) from tbl_test; | 1.75 |
| percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression) | double precision[] | double precisionor interval | 排序表達式的類型的數組 | 多個連續百分位:返回與 形狀匹配的結果數組 分數 參數 ,每個非null元素替換為與該百分位對應的值 | ||
| percentile_disc(fraction) WITHIN GROUP (ORDER BY sort_expression) | double precision | any sortable type | same as sort expression | 離散百分位數:返回第一個輸入值,該值在順序中的位置等於或超過指定的分數 | ||
| percentile_disc(fractions) WITHIN GROUP (ORDER BY sort_expression) | double precision[] | any sortable type | array of sort expression's type | 多個離散百分比:返回與分數參數的形狀匹配的結果數組,每個非null元素均替換為與該百分比對應的輸入值 |
