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

Can a plpython function take multiple rows as parameter?

我需要知道如何制作接受多行数组和 returns 结果数组的函数。

例如:

Table some_table

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

然后运行:

SELECT custom_avg(num_array) FROM some_table;

并得到一个按元素操作的数组(本例中为平均值):

[1.5, 1.5, 1.5]

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

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

我知道数组可以展开成 table,但我正在努力避免这种情况。 如果这种功能可以用标准 SQL 解决,那也很有用。

函数

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

The argument types can be base, composite, or domain types, or can reference the type of a table column.

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

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 Fiddle.

更多:

  • PostgreSQL unnest() with element number