编写PostgreSQL聚合函数,其中输入值是数组

时间:2013-09-20 18:34:15

标签: arrays postgresql aggregate-functions

我有一个表,其列是实数数组,如此

   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[]

似乎不支持直接支持数组数组,即使是2D数组也是如此!

我真的不理解http://postgresql.1045698.n5.nabble.com/could-not-find-array-type-for-data-type-character-varying-td1879264.html

的回复

也许我需要创建一个新类型

CREATE TYPE profile AS (a_name REAL[])

然后是什么? 或者我可能需要加载嵌套unnest()array_to_string() ...?

我可以以某种方式迭代每个数组元素

SELECT  sum (my_column[i])

对于i,1到n,但是如何?

1 个答案:

答案 0 :(得分:2)

你可以为此写一个非常简单的CREATE AGGREGATE语句;见this similar prior post

效率不高,因此PL / R将是一个更好的选择。或者如果你勇敢的话在C中写一个聚合--C中的PostgreSQL数组API非常难看。