Sql 在Postgres中的数组字段上应用聚合函数?

Sql 在Postgres中的数组字段上应用聚合函数?,sql,arrays,postgresql,Sql,Arrays,Postgresql,是否可以对整型[]字段(或其他数字数组)中的所有值应用聚合(如avg()、stddev())呢 我可以通过将数组拆分为多行来解决此问题,如 select avg(m)::float from (select unnest(measurement) m from widget) q; 但它不那么优雅 谢谢。您可以创建如下简单函数: create function array_avg(_data anyarray) returns numeric as $$ select avg(a)

是否可以对整型[]字段(或其他数字数组)中的所有值应用聚合(如avg()、stddev())呢

我可以通过将数组拆分为多行来解决此问题,如

select avg(m)::float from (select unnest(measurement) m from widget) q;
但它不那么优雅


谢谢。

您可以创建如下简单函数:

create function array_avg(_data anyarray)
returns numeric
as
$$
    select avg(a)
    from unnest(_data) as a
$$ language sql;
然后像这样询问它

select avg(array_avg(measurement))
from widget;
或者你可以简单地做

select avg((select avg(a) from unnest(measurement) as a))
from widget;

如果有人想知道如何做到这一点,同时保留其他属性,而不进行分组,横向联接提供了一个简单的解决方案:

select Point, High, Low, Average
    from GridPoint G
    join lateral (
        select Max(V) High, Min(V) Low, Avg(V) Average
            from Unnest(G.Values) V
    ) _ on true

您可以定义一个自定义聚合,该聚合将与数组一起使用。或者创建一个简单的函数,将数组转换为单个聚合值,并在此函数之上进行聚合。
select Point, High, Low, Average
    from GridPoint G
    join lateral (
        select Max(V) High, Min(V) Low, Avg(V) Average
            from Unnest(G.Values) V
    ) _ on true