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;
基本上:
- 在
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;
更多:
- PostgreSQL unnest() with element number
我需要知道如何制作接受多行数组和 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;
基本上:
- 在
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;
更多:
- PostgreSQL unnest() with element number