1

我需要知道要制作采用多行数组并返回结果数组的函数。

例如:

表 some_table

id | num_array
1  | [1,1,1]
2  | [2,2,2]

然后运行:

SELECT custom_avg(num_array) FROM some_table;

并获得一个按元素操作的数组(在本例中为 avg):

[1.5, 1.5, 1.5]

类似于对行进行操作的标准聚合函数。

在查看文档和谷歌搜索近 2 小时后,我找不到直接的答案。

我知道数组可以展开成表格,但我试图避免这种情况。如果这种功能可以用标准 SQL 来解决,那也很有用。

4

1 回答 1

3

功能

Postgres 函数不能将表(“多行”)作为参数。根据文档

参数类型可以是基类型、复合类型或域类型,也可以引用表列的类型。

您将使用游标或临时表通过引用传递表...

SQL

但是你可以用简单的 SQL 解决大多数问题。要计算一维数组列中每个位置的平均值:

您没有提供您的版本,所以我假设是当前版本。WITH ORDINALITY需要 Postgres 9.4

SELECT ARRAY (
   SELECT avg(elem) AS avg_elem
   FROM   tbl t
        , unnest (t.num_array) WITH ORDINALITY a(elem, rn)
   GROUP  BY a.rn
   ORDER  BY a.rn
   ) AS arr_avg;

基本上:

  1. 在连接中取消嵌套每个数组LATERAL(此处为隐式),记住元素的序数位置
  2. GROUP BY这个位置。
  3. 构造一个按此位置排序的结果数组。

旧版本中没有那么优雅的替代品。对于 Postgres 9.3

SELECT ARRAY (
   SELECT avg(t.num_array[i]) AS avg_elem
   FROM   tbl t, generate_subscripts(t.num_array, 1) i
   GROUP  BY i
   ORDER  BY i
   ) AS arr_avg;

SQL小提琴。

更多的:

于 2015-04-12T22:05:45.803 回答