postgresql - 将 Postgres 聚合函数转换为内联数组

标签 postgresql aggregate-functions standard-deviation

有人问我如何对行内的变量值列表进行标准差。例如:

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 => leastmax => 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/

相关文章:

postgresql - 在两个不同的go应用程序中来自postgres的数据查询不一致

java - 在 hibernate 中使用多态类建模一对一映射

MYSQL 连接最大长度

带有 WHERE IN 子句的 SQL MAX 日期

Python:如何获取数据框中多个数组的元素标准差

algorithm - 在数字数据集中查找 'Outliers'

postgresql - 为什么这个 PostgreSQL 事务给出 "WARNING: there is no transaction in progress"

sql - 常用词的 Postgres 全文搜索性能

sql - 根据条件聚合文本

C++计算平均值和标准差