簡體   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