我正在创建一个需要额外参数的用户定义聚合函数。更确切地说,它是累积(也称为窗口)最小值,其将第二参数作为定义窗口的时间间隔。由于聚合函数对我的用户定义数据类型进行操作,因此我传达了一个虚拟示例,用于计算列的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。我知道根据文档,直接参数仅允许用于有序集合,但我还需要一个直接参数用于" normal"聚集体。
答案 0 :(得分:0)
您可以使用两个参数定义聚合,并将您的附加参数作为常量第二个参数提供。
SFUNC
只存储第二个参数,例如作为STYPE
整数数组的第0个元素。
FINALFUNC
只有一个参数,从数组的第0个元素中获取n
。
如果您需要第二个不是整数的参数,请定义复合类型并将其用作STYPE
。
不漂亮,但它应该可以解决问题。