【问题标题】:在 PostgreSQL 中的数组字段上聚合 Avg()
【发布时间】:2022-01-05 06:33:39
【问题描述】:

在这个问题被标记和关闭之前,我已经看到了this 的问题,但它并不能完全回答我的问题。

我想计算每行字段中数组的元素平均值,并保持维度

create table if not exists my_arrays (array_field float[]);

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

select avg(array_field) as x from my_arrays;

应该输出:

    x
---------
{2, 2, 2}

这可能吗?

【问题讨论】:

  • 错误是get is that no avg(float[]) exists ...

标签: sql arrays postgresql aggregate-functions


【解决方案1】:

您可以使用unnest...with ordinality 将它们分开,同时标记它们的位置,然后按位置分组,然后使用array_agg 重新组合。

select array_agg(avg order by ordinality) from (
    select ordinality, avg(unnest) from my_arrays, unnest(array_field) with ordinality group by ordinality
) foo;

您需要确保它以您认为合适的方式处理 NULL 和缺失值。

如果您经常这样做,定义您自己的在float[] 上运行的聚合可能是有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多