PostgreSQL中如何对integer[]数组列转置后按位求和
PostgreSQL 数组按位置求和方案
从你给出的表字段类型integer[]判断使用的是PostgreSQL数据库,不需要编写自定义SQL函数,原生语法即可实现数据库侧聚合计算,千条数据量级计算耗时在1ms以内,远优于前端拉取全量数据再计算的效率。
输出为9个独立列
PostgreSQL数组默认从1开始索引,直接按下标取对应位置值求和即可,测试数据运行结果完全匹配你的预期:
SELECT SUM(counts[1]) AS value0, SUM(counts[2]) AS value1, SUM(counts[3]) AS value2, SUM(counts[4]) AS value3, SUM(counts[5]) AS value4, SUM(counts[6]) AS value5, SUM(counts[7]) AS value6, SUM(counts[8]) AS value7, SUM(counts[9]) AS value8 FROM 你的表名;
输出为单个数组
固定长度写法(性能最优)
直接将上述各位置求和结果用数组构造器包装即可,逻辑简单易维护:
SELECT ARRAY[ SUM(counts[1]), SUM(counts[2]), SUM(counts[3]), SUM(counts[4]), SUM(counts[5]), SUM(counts[6]), SUM(counts[7]), SUM(counts[8]), SUM(counts[9]) ] AS counts FROM 你的表名;
通用动态写法(适配任意数组长度)
如果后续数组长度可能调整,可以用unnest加序数标记的写法,不需要硬编码下标,不管数组有多少个元素都能正确按位置求和:
SELECT ARRAY( SELECT SUM(val) FROM 你的表名, unnest(counts) WITH ORDINALITY AS t(val, idx) GROUP BY idx ORDER BY idx ) AS counts;
注意事项
- 不要按0下标取数组元素,PostgreSQL默认数组索引起始值为1,0下标会返回空值
- 通用写法的性能和固定下标写法差异极小,千条到十万条数据级别都可以放心使用
内容的提问来源于stack exchange,提问作者tkgstrator
相关产品推荐
相关产品推荐

