我需要知道要生成带有多行数组并返回结果数组的函数。
例如:
表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解决,那也很有用。
答案 0 :(得分:2)
Postgres函数不能将表(“多行”)作为参数。 Per documentation:
参数类型可以是基本类型,复合类型或域类型,也可以是 引用表列的类型。
您可以使用游标或临时表传递一个表...
但是您可以使用纯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;
基本上:
LATERAL
联接中的每个数组(此处隐含),记住元素的序数位置GROUP BY
这个职位。旧版本中的优雅选择较少。对于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;
更多: