给定一个表,其中的列包含固定/相同大小的双精度[]。
我能够获取最小和最大的元素明智聚合:
select min(array_col) from table
select max(array_col) from table
结果应该再次是相同大小的双精度[]。
如果我想使用 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()
使用的方式不会选择每个数组中或所有组合数组中的最小/最大元素,而是根据默认数组顺序选择第一个数组。同样适用于max()
。要从所有数组中获取最小/最大,请使用第一个示例,要从每个数组中获取一个,请使用第二个。