给定一个表,其中有一列包含固定/相同大小的
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()
也会发生同样的情况。有什么解决办法吗?
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()
。要从所有数组中获取最小/最大元素或元素总和,请使用第一个示例,或使用第二个示例从每个数组中获取一个。