PostgreSQL - 按索引对数组求和

dan*_*dan 2 postgresql performance array postgresql-performance

我在 PostgreSQL 中有一个 doubles 列(double precision[])的数组,它可以保留一天的半小时值。所以每个数组都有 48 个值。我需要一个有效的查询,它按索引对所有这些数组列求和,并生成一个新的 48 数组索引,如下所述

A = double[48] = {3,2,0,3....1}
B = double[48] = {1,0,3,2....5}

RESULT = double[48] = {A[0] + B[0], A[1] + B[1],...,A[47] + B[47]}
Run Code Online (Sandbox Code Playgroud)

谢谢!

cha*_*cha 5

我会和unnest一起使用array_agg,像这样: SQL Fiddle

PostgreSQL 9.3.1 架构设置

create table t (
A double precision[5],
B double precision[5]);

insert into t values
('{3,2,0,3,1}', '{1,0,3,2,5}');
Run Code Online (Sandbox Code Playgroud)

查询 1

with c as(
select unnest(a) a, unnest(b) b from t)
select array_agg(a) a, array_agg(b) b, array_agg(a + b) c from c
Run Code Online (Sandbox Code Playgroud)

结果

|         A |         B |         C |
|-----------|-----------|-----------|
| 3,2,0,3,1 | 1,0,3,2,5 | 4,2,3,5,6 |
Run Code Online (Sandbox Code Playgroud)

正如下面所评论的,上面的查询将适用于相同大小的数组。否则可能会产生意想不到的结果。

如果您需要支持不同大小的数组,请使用此查询

with a as(
  select unnest(a) a from t),
b as(
  select unnest(b) b from t),
ar as(
  select a, row_number() over() r from a),
br as(
  select b, row_number() over() r from b),
c as(
  select ar.a, br.b from ar inner join br on ar.r = br.r)
select array_agg(a) a, array_agg(b) b, array_agg(a + b) c from c;
Run Code Online (Sandbox Code Playgroud)