在 Postgres 中的数组字段上应用聚合函数?
Posted
技术标签:
【中文标题】在 Postgres 中的数组字段上应用聚合函数?【英文标题】:Apply aggregate functions on array fields in 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;
但它不那么优雅。
谢谢。
【问题讨论】:
您可以定义一个自定义聚合,它将与数组一起使用。或者创建一个简单的函数,将数组转换为单个聚合值并在此函数之上聚合。 【参考方案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
【讨论】:
以上是关于在 Postgres 中的数组字段上应用聚合函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何将现有函数(包括聚合)包装到 Postgres 中的新函数中?