繁体   English   中英

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

[英]Direct arguments in PostgreSQL user-defined aggregate functions

我正在创建一个需要附加参数的用户定义的聚合函数。 更准确地说,它是一个累计(aka窗口)最小值,它将定义该窗口的时间间隔作为第二个参数。 由于聚合函数对用户定义的数据类型进行操作,因此我提供了一个虚拟示例,该示例计算列的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。 我知道根据文档,直接参数仅适用于有序集合 ,但我也需要直接参数用于“常规”聚合。

您可以定义带有两个参数的集合,并提供其他参数作为常量第二个参数。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM