PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Função agregada de soma de matriz pareada?


Soluções gerais para qualquer número de arrays com qualquer número de elementos. Elementos individuais ou o array inteiro também podem ser NULL:

Mais simples na versão 9.4+ usando WITH ORDINALITY

SELECT ARRAY (
   SELECT sum(elem)
   FROM  tbl t
       , unnest(t.arr) WITH ORDINALITY x(elem, rn)
   GROUP BY rn
   ORDER BY rn
   );

Ver:

Postgres 9.3+


Isso faz uso de um LATERAL JOIN implícito
SELECT ARRAY (
   SELECT sum(arr[rn])
   FROM   tbl t
        , generate_subscripts(t.arr, 1) AS rn
   GROUP  BY rn
   ORDER  BY rn
   );

Ver:

Postgres 9.1

SELECT ARRAY (
   SELECT sum(arr[rn])
   FROM  (
      SELECT arr, generate_subscripts(arr, 1) AS rn
      FROM   tbl t
      ) sub
   GROUP  BY rn
   ORDER  BY rn
   );

O mesmo funciona em versões posteriores, mas funções de retorno de conjunto no SELECT lista não são SQL padrão e foram desaprovados por alguns. Deve estar tudo bem desde o Postgres 10, no entanto. Ver:

db<>fiddle aqui
Antigo sqlfiddle

Relacionado: