plpython函数可以将多行作为参数吗?

时间:2015-04-12 20:27:44

标签: arrays postgresql aggregate-functions plpython

我需要知道要生成带有多行数组并返回结果数组的函数。

例如:

表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解决,那也很有用。

1 个答案:

答案 0 :(得分:2)

功能

Postgres函数不能将表(“多行”)作为参数。 Per documentation

  

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

您可以使用游标或临时表传递一个表...

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. 构造一个由此位置排序的结果数组。
  4. 旧版本中的优雅选择较少。对于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 Fiddle.

    更多: