【发布时间】:2012-09-06 05:51:57
【问题描述】:
我正在尝试在 PostgreSQL 中创建新的聚合函数来代替 sum() 函数
我从手册here开始我的旅程。
因为我想创建一个函数,它接受一个双精度值数组,对它们求和,然后进行一些额外的计算,所以我首先创建了最终函数:
takes double precision as input and gives double precision as output
DECLARE
v double precision;
BEGIN
IF tax > 256 THEN
v := 256;
ELSE
v := tax;
END IF;
RETURN v*0.21/0.79;
END;
然后我想创建一个聚合函数,它接受一个双精度值数组并输出一个双精度值供我之前的函数处理。
CREATE AGGREGATE aggregate_ee_income_tax (float8[]) (
sfunc = array_agg
,stype = float8
,initcond = '{}'
,finalfunc = eeincometax);
当我运行该命令时,我得到的是:
错误:函数array_agg(双精度,双精度[])确实 不存在
我有点卡在这里,因为手册将array_agg() 列为现有函数。我做错了什么?
另外,当我跑步时:
\da
List of aggregate functions
Schema | Name | Result data type | Argument data types | Description
--------+------+------------------+---------------------+-------------
(0 rows)
我的安装根本没有聚合函数?还是只列出用户定义的函数?
基本上我想了解的内容:
1) 我可以使用现有函数来汇总我的数组值吗?
2) 我如何知道函数的输入和输出数据类型?文档声称array_agg() 接受任何类型的输入。
3) 我自己的聚合函数有什么问题?
编辑 1
为了提供更多信息和更清晰地了解我正在努力实现的目标:
我对几个表有一个巨大的查询,如下所示:
SELECT sum(tax) ... from (SUBQUERY) as foo group by id
我想用我自己的聚合函数替换那个 sum 函数,这样我就不必在后端进行额外的计算 - 因为它们都可以在数据库级别完成。
编辑 2
接受蚂蚁的回答。由于最终解决方案来自 cmets,因此我将其发布在这里以供参考:
CREATE AGGREGATE aggregate_ee_income_tax (float8)
(
sfunc = float8pl
,stype = float8
,initcond = '0.0'
,finalfunc = eeincometax
);
【问题讨论】:
-
从你的描述我不明白为什么你不能只使用
yourfinalfunc(sum(tax))来转换最终结果?这将完全避免创建聚合函数。 -
因为我提到的那个查询是以编程方式放在一起的,如果我要在另一个函数之上添加一个函数,那么我将不得不在将查询放在一起的过程中进行很多更改。添加一堆条件和诸如此类的东西 - 所有这些都会使以后更难理解代码。因此,只需更改 sum 函数就更容易了。
标签: postgresql aggregate-functions plpgsql