我正在尝试创建新的聚合函数,在PostgreSQL中使用代替 sum()
函数。
我开始查看这里的手册。
由于我想创建一个函数,该函数接受一组双精度值,对它们进行求和,然后进行一些额外的计算,因此我首先创建了最终函数:
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(double precision, double precision[])不存在
另外,当我运行以下命令时:
\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
接受Ants的答案。由于最终解决方案来自评论,因此在此进行引用:
CREATE AGGREGATE aggregate_ee_income_tax (float8)
(
sfunc = float8pl
,stype = float8
,initcond = '0.0'
,finalfunc = eeincometax
);
yourfinalfunc(sum(tax))
来转换最终结果呢?这样可以完全避免创建聚合函数。 - araqnid