【问题标题】:Apply aggregate functions on array fields in Postgres?在 Postgres 中的数组字段上应用聚合函数?
【发布时间】:2013-09-28 13:08:13
【问题描述】:

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

CREATE TABLE widget
(
  measurement integer[]
);

insert into widget (measurement) values ( '{1, 2, 3}');

select avg(measurement::integer[]) from widget;

ERROR:  function avg(integer[]) does not exist
LINE 4: select avg(measurement::integer[]) from widget;
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

********** Error **********

ERROR: function avg(integer[]) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 71

我可以通过将数组分成多行来解决,例如

select avg(m)::float from (select unnest(measurement) m from widget) q;

但它不那么优雅。

谢谢。

【问题讨论】:

  • 您可以定义一个自定义聚合,它将与数组一起使用。或者创建一个简单的函数,将数组转换为单个聚合值并在此函数之上聚合。

标签: sql arrays postgresql


【解决方案1】:

如果有人想知道如何在保留其他属性的同时不分组,横向连接提供了一个简单的解决方案:

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

【讨论】:

    【解决方案2】:

    你可以像这样创建简单的函数:

    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;
    

    sql fiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多