用户定义的聚合函数,PostgreSQL中有多个输入列

时间:2011-04-15 08:03:44

标签: sql postgresql aggregate-functions

我正在尝试创建使用多列作为输入的user-defined aggregate functions,并输出一列。

例如,要计算weighted average,我们可能会使用两个名为num_samplesquantity的列,其代码如下:

SELECT sum(num_samples * quantity) / sum(num_samples) AS weighted_avg FROM table; 

但是,我想要定义的函数非常复杂(例如加权标准偏差)并且被多次使用。我想定义自己的聚合函数,以便在select查询中轻松使用它们。例如,如果我想找到加权平均值和总和,我会使用这样的查询:

SELECT weighted_avg(num_samples, quantity), sum(quantity)

但是,从文档中看来,用户定义的聚合只允许使用单个状态变量,但是这个示例需要两个状态变量:一个用于运行总计quantity,另一个用于运行总计num_samples

是否有可能通过用户定义的聚合函数实现我想要的功能,还是有更好的方法?我正在使用PostgreSQL 8.3。

2 个答案:

答案 0 :(得分:2)

请参阅:How to create multi-column aggregates,自PostgreSQL 8.2起可用

对于多个状态变量,正如Jack所说,你可以使用数组作为状态变量。

答案 1 :(得分:0)

从您的链接:“avg(平均值)是一个更复杂的聚合示例。它需要两个运行状态:输入的总和和输入数量的计数。最终的结果是通过划分获得的平均值通常通过使用两元素数组作为状态值来实现。“

做那样的事情怎么样?