PostgreSQL用户定义的聚合函数中的直接参数

时间:2018-01-10 14:36:13

标签: postgresql parameters user-defined-aggregate

我正在创建一个需要额外参数的用户定义聚合函数。更确切地说,它是累积(也称为窗口)最小值,其将第二参数作为定义窗口的时间间隔。由于聚合函数对我的用户定义数据类型进行操作,因此我传达了一个虚拟示例,用于计算列的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"聚集体。

1 个答案:

答案 0 :(得分:0)

您可以使用两个参数定义聚合,并将您的附加参数作为常量第二个参数提供。

SFUNC只存储第二个参数,例如作为STYPE整数数组的第0个元素。

FINALFUNC只有一个参数,从数组的第0个元素中获取n

如果您需要第二个不是整数的参数,请定义复合类型并将其用作STYPE

不漂亮,但它应该可以解决问题。