![](/img/trans.png)
[英]User-defined aggregate functions with multiple input columns in 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.