【问题标题】:Writing a PostgreSQL aggregate function where the input values are arrays编写一个 PostgreSQL 聚合函数,其中输入值是数组
【发布时间】:2018-05-04 18:27:33
【问题描述】:

我有一个表,它的列是实数数组,像这样

   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/,因为我最终可能会处理更复杂的数字。 p>

不过,与此同时,由于我目前的需求很简单,而且我想学习一些聚合函数编写的基础知识,因此我需要一些帮助。我想我可以使用内置函数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[]

似乎不直接支持数组数组,尽管二维数组是!

我不太明白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()ing 或array_to_string()ing...?

我可以以某种方式遍历每个数组元素

SELECT  sum (my_column[i])

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

【问题讨论】:

标签: arrays postgresql aggregate-functions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2015-01-26
    • 2011-05-23
    相关资源
    最近更新 更多