2012-04-19 6 views
1
度の平均方向がします

私はPostgresの中でカスタム集計機能を実装しようとしている - つまり、私が行うことができるにしたい:これは、式を使用して行うことができるカスタムPostgreSQLの集約円形平均

SELECT circavg(direction) FROM sometable; 

xbar = atan2(sum(sin(xi), sum(cos(xi))) 

私は方向がかかりますsfuncを定義し、2つのアキュムレータにそのサインとコサインを追加する必要があると思います。最後の関数は、atan2を使用して2つのコンポーネントを方向に戻します。

sfuncをどのように定義するのがうまくいかないため、現在の状態が2つのコンポーネントで構成されています。 (フロート、フロート)。ドキュメントは具体的な例では少し不足しているので、どんな助けもありがとうございます。

+0

ようこそ! あなたが記述した 'circavg'は' xbar'サンプルで2つのパラメータを指定している間、単一のパラメータを取ります。また、あなたの例では閉じ括弧が見付かりません。 – vyegorov

+1

@vyegorov:xbarの例には1つのパラメータ( 'xi')しかありませんが、2つの場所で使用されます。 –

+0

初心者のための+1の良い質問。 –

答えて

2

最初のバージョンにはバグがありました。今すぐ固定してテスト済み
内部で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です​​。)

+0

これは有望ですが、集計関数の定義で文法エラーが発生しています: 'syntax error at or near" :: "'。 (私はPostgres 9.1.3を実行しています) – samwise

+0

@ samwise:申し訳ありません、テスト後にそのキャストを追加しました。修正され、今すぐ動作するはずです。 –

+0

偉大な - それは動作します。私の最初のSOの質問にお返事いただきありがとうございます。 – samwise

0

PostgreSQLは、geometry typesのセットを提供します。POINTが基本的なものです。
このタイプは、関数の入力パラメータとして使用します。

希望により、custom typeを作成することもできます。

関連する問題