在 PostgreSQL 中的数组字段上聚合 Avg()
Aggregate Avg() over array fields in PostgreSQL
在这个问题被标记和关闭之前,我已经看到了 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}
这可能吗?
您可以使用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[]
上运行的聚合可能是有意义的。
在这个问题被标记和关闭之前,我已经看到了 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}
这可能吗?
您可以使用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[]
上运行的聚合可能是有意义的。