PostgreSQL 分組、聚合函數


根據老師表(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元素均替換為與該百分比對應的輸入值

https://www.cnblogs.com/alianbog/p/5674838.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM