数组列上聚合函数的问题

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

给定一个表,其中的列包含固定/相同大小的双精度[]。

我能够获取最小和最大的元素明智聚合:

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

结果应该再次是相同大小的双精度[]。

如果我想使用 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()
使用的方式不会选择每个数组中或所有组合数组中的最小/最大元素,而是根据默认数组顺序选择第一个数组。同样适用于
max()
。要从所有数组中获取最小/最大,请使用第一个示例,要从每个数组中获取一个,请使用第二个。

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