数组列上的聚合函数

问题描述 投票:0回答:1

给定一个表,其中有一列包含固定/相同大小的

double precision[]
。 我能够获取最小和最大的元素明智聚合:

select min(array_col) from table;
select max(array_col) from table;

结果应该再次是相同大小的

double precision[]
。如果我想使用
avg()
stddev()
,我会收到如下错误消息:

function stddev(double precision[]) does not exists

avg()
也会发生同样的情况。有什么解决办法吗?

postgresql aggregate-functions
1个回答
0
投票

使用

unnest()
打开数组并处理其元素:demo

select avg(el) from (select unnest(array_col) el from test) a;
select stddev(el) from (select unnest(array_col) el from test) a;

这将取所有数组的所有元素的平均值。要获得每个数组的单独平均值,请通过主键区分它们(或使用

row_number()over()
添加一些唯一的 id)并使用
group by
:

select id,
       avg(el),
       stddev(el)
from (select row_number()over() as id, 
             unnest(array_col) el 
      from test) a 
group by id;

请注意,

min()
使用的方式不会选择每个数组中的最小/最大元素,或者从所有组合数组中选择最小/最大元素,或者具有最小值总和的数组,而是根据以下方式选择第一个/最后一个数组默认数组顺序 - 在这种情况下,它首先为空,后续元素的值升序,最后是
null
。同样适用于
max()
。要从所有数组中获取最小/最大元素或元素总和,请使用第一个示例,或使用第二个示例从每个数组中获取一个。

© www.soinside.com 2019 - 2024. All rights reserved.