有人问我如何对行内的变量值列表进行标准差。例如:
select
name, x, y, z, stddev (x, y, z)
from foo;
或
select
order_no, a, b, c, d, e, f, stddev (a, b, c, d, e, f)
from foo;
所以本质上就像 min
=> least
和 max
=> greatest
一样,我想要一个类似的方法将聚合 stddev 转换为“正常”函数。
我已经能够创建一个自定义函数来根据标准公式计算标准差,但如果可能的话,我忍不住更喜欢使用内置函数。我试过这个:
CREATE OR REPLACE FUNCTION std_deviation(variadic inputs numeric[])
RETURNS numeric AS
$BODY$
DECLARE
result numeric;
BEGIN
select stddev (unnest (inputs))
into result;
return result;
end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
它提示:
ERROR: set-valued function called in context that cannot accept a set
此错误消息并不缺少流量,但我不太清楚如何将修复应用到我的简单函数。
或者,有没有更好的方法从一开始就做到这一点?
最佳答案
SELECT 子句中的
集合返回函数 (SRF)(例如 unnest
)是 SQL 标准的 PostgreSQL 特定扩展。通常不值得使用它(因为它不是看起来的那样)。此外,SRF 不能在聚合函数中使用。
在 FROM
子句中使用这些 SRF 函数(并在需要时使用子选择):
SELECT name, x, y, z, (SELECT stddev(v) FROM unnest(ARRAY[x, y, z]) v)
FROM foo
如果您确实想为此编写一个函数,请使用 SQL
语言(它更清晰并且 PostgreSQL 可以优化它们的使用):
CREATE OR REPLACE FUNCTION std_deviation(variadic inputs numeric[])
RETURNS numeric AS
$BODY$
SELECT stddev(v) FROM unnest(inputs) v
$BODY$
LANGUAGE SQL IMMUTABLE;
关于postgresql - 将 Postgres 聚合函数转换为内联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34136443/