2

我正在创建一个需要附加参数的用户定义聚合函数。更准确地说,它是一个累积(又名窗口)最小值,它将定义窗口的时间间隔作为第二个参数。由于聚合函数对我的用户定义的数据类型进行操作,我已经传达了一个虚拟示例,该示例计算列的最后 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。我知道根据文档,直接参数只允许用于有序集聚合,但我还需要一个用于“普通”聚合的直接参数。

4

1 回答 1

1

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

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

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

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

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

于 2018-01-10T15:04:33.030 回答