最初のバージョンにはバグがありました。今すぐ固定してテスト済み
内部でARRAYタイプを使用することができます。引き数タイプは、引き続き任意の数値タイプにすることができます。私はここでfloat
(= double precision
)を使用します。
は次のように仕事ができる:
CREATE TEMP TABLE t (x float);
INSERT INTO t VALUES (2), (3), (4), (5);
コール:
SELECT circavg(x) FROM t;
circavg
-------------------
-2.78318530717959
クロスチェック:
SELECT atan2(sum(sin(x)), sum(cos(x))) FROM t;
atan2
-------------------
-2.78318530717959
テストのための
CREATE OR REPLACE FUNCTION f_circavg (float[], float)
RETURNS float[] AS
$body$
SELECT ARRAY[$1[1] + sin($2), $1[2] + cos($2)];
$body$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION f_circavg_final (float[])
RETURNS float AS
$body$
SELECT atan2($1[1], $1[2]);
$body$ LANGUAGE sql;
CREATE AGGREGATE circavg (float)
(sfunc = f_circavg
,stype = float[]
,finalfunc = f_circavg_final
,initcond = '{0,0}'
);
一時テーブル
同じものを返します。今働こうとしているようだ。
BTW:通常の集計関数を持つ最後の式がカスタム集計よりも4倍高速だった大きなテーブルでテストしました。 (しかしどちらも速く、5000行で数msです。)
ようこそ! あなたが記述した 'circavg'は' xbar'サンプルで2つのパラメータを指定している間、単一のパラメータを取ります。また、あなたの例では閉じ括弧が見付かりません。 – vyegorov
@vyegorov:xbarの例には1つのパラメータ( 'xi')しかありませんが、2つの場所で使用されます。 –
初心者のための+1の良い質問。 –