我有一个表,其列是实数数组,像这样
my_column
-----------------
{5.7, 1.5, 1.7, ...}
{4.2, 4.1, 2.6, ...}
etc
我希望产生一个总和数组,其中每个元素都是相应元素的总和,沿着行 - 像这样
my_column_aggregate
--------------------------------------------------------
{sum(5.7,4.2, etc), sum(1.5,4.1,etc), sum(1.7,2.6,etc) ...}
我的表有几个这样的列和大约 10 到 100 个无序行,每个数组具有相同数量(大约 20)的有序元素。从概念上讲,表格是一个矩阵,当然我可以使用其他排列方式存储它,但由于其他原因,它可能会保持这种方式。
我需要写一个函数my_agg_sum()
,比如说,所以我可以
SELECT my_agg_sum (my_column) FROM ... WHERE ...
在做了一些研究之后,我认为我最终应该安装和使用R http://www.r-project.org/和 PL/R http://www.joeconway.com/plr/因为我可能最终会拥有更多复杂的数字运算。
然而,与此同时,由于我目前的需求很简单,并且我想学习一些聚合函数编写的基础知识,所以我需要一些帮助。我想我可以使用内置函数array_agg()
来收集一个数组数组——一个矩阵——我可以为此编写求和函数。(因为我对 PL/pgSQL 很陌生,所以我会使用这个http://ledgersmbdev.blogspot.ca/2013/04/introduction-to-postgresql-arrays-basic.html作为示例指南。)如果我可以得到一个中间结果
{{5.7, 1.5, 1.7, ...}, {4.2, 4.1, 2.6, ...}, etc}
我想我没事。问题是,当我尝试
SELECT array_agg (my_column)
我明白了
ERROR: could not find array type for data type real[]
似乎不直接支持数组数组,即使二维数组是!
也许我需要创建一个新类型
CREATE TYPE profile AS (a_name REAL[])
然后什么?或者,也许我需要做大量的嵌套unnest()
ing 或array_to_string()
ing ...?
我可以以某种方式遍历每个数组元素
SELECT sum (my_column[i])
对于 i,从 1 到 n,但是如何?