我正在创建一个需要附加参数的用户定义聚合函数。更准确地说,它是一个累积(又名窗口)最小值,它将定义窗口的时间间隔作为第二个参数。由于聚合函数对我的用户定义的数据类型进行操作,我已经传达了一个虚拟示例,该示例计算列的最后 n 个值的平均值。我知道我可以在 PostgreSQL 中解决这个虚拟问题,但该示例的目的只是为了突出我的问题。
CREATE FUNCTION lastNavg_transfn(state integer[], next integer, n integer)
RETURNS integer[] AS $$
BEGIN
RETURN array_append(state, next);
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
CREATE FUNCTION lastNavg_finalfn(state integer[], n integer)
RETURNS float AS $$
DECLARE
card integer;
count float;
sum float;
BEGIN
count := 0;
sum := 0;
card := array_length(state, 1);
FOR i IN greatest(1,card-n+1)..card
LOOP
sum := sum + state[i];
count := count + 1;
END LOOP;
RETURN sum/count;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE;
CREATE AGGREGATE lastNavg(integer, integer) (
SFUNC = lastNavg_transfn,
STYPE = integer[],
INITCOND = '{}',
FINALFUNC = lastNavg_finalfn,
PARALLEL = SAFE
);
我收到以下错误
ERROR: function lastnavg_finalfn(integer[]) does not exist
SQL state: 42883
如何告诉 PostgreSQL 我的最终函数也需要直接参数?我正在研究 PostgreSQL 10.1。我知道根据文档,直接参数只允许用于有序集聚合,但我还需要一个用于“普通”聚合的直接参数。