postgresql – 成对数组和聚合函数?

postgresql – 成对数组和聚合函数?,第1张

概述我有一个数组作为一列的表,我想将数组元素加在一起: > create table regres(a int[] not null);> insert into regres values ('{1,2,3}'), ('{9, 12, 13}');> select * from regres; a----------- {1,2,3} {9,12,13} 我希望结果如下: {10 我有一个数组作为一列的表,我想将数组元素加在一起:
> create table regres(a int[] not null);> insert into regres values ('{1,2,3}'),('{9,12,13}');> select * from regres;     a----------- {1,3} {9,13}

我希望结果如下:

{10,14,16}

那是:{1 9,2 12,3 3}.

这样的功能在某处已经存在吗?插入扩展看起来是一个很好的候选者,但这样的功能尚不存在.

预计数组的长度在24到31个元素之间,所有元素都是NOT NulL,并且数组本身也总是NOT NulL.所有元素都是基本的int.每个聚合将有两行以上.在查询中,所有数组都将具有相同数量的元素.不同的查询将具有不同数量的元素.

我的实现目标是:x86_64-unkNown-linux-gnu上的Postgresql 9.1.13,由gcc编译(Ubuntu / linaro 4.6.3-1ubuntu5)4.6.3,64位

Postgres 9.3中的一般解决方案,适用于任意数量的元素阵列.
单个元素或整个数组也可以为NulL:
SELECT ARRAY (   SELECT sum(arr[rn])   FROM  tbl t,generate_subscripts(t.arr,1) AS rn   GROUP BY rn   ORDER BY rn   );

这使用了隐含的LATERAL JOIN(Postgres 9.3).
使用您的示例值:

SELECT ARRAY (   SELECT sum(arr[rn])   FROM  (      VALUES        ('{1,3}'::int[]),13}')      ) t(arr),1) AS rn   GROUP BY rn   ORDER BY rn   );

非平凡的例子:

SELECT ARRAY (   SELECT sum(arr[rn])   FROM  (      VALUES        ('{1,13}'),('{1,1,33}'),('{NulL,NulL}'),(NulL)      ) t(arr),1) AS rn   GROUP BY rn   ORDER BY rn   );

使用WITH ORDINALITY在9.4中更简单

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

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   );

同样适用于更高版本,但SELECT列表中的set-returns函数不是标准sql,并且有些人不赞成.因此,使用上述替代品与当前的Postgres.

SQL Fiddle.

相关答案以及更多解释:

> PostgreSQL unnest() with element number
> Is there something like a zip() function in PostgreSQL that combines two arrays?

总结

以上是内存溢出为你收集整理的postgresql – 成对数组和聚合函数?全部内容,希望文章能够帮你解决postgresql – 成对数组和聚合函数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1164254.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存