CREATE AGGREGATE name [ AS ] ( BASETYPE = data_type [ , SFUNC1 = sfunc1 , STYPE1 = sfunc1_return_type ] [ , SFUNC2 = sfunc2 , STYPE2 = sfunc2_return_type ] [ , FINALFUNC = ffunc ] [ , INITCOND1 = initial_condition1 ] [ , INITCOND2 = initial_condition2 ] )
作成する集約関数の名前です。
この集約関数が影響を及ぼす基準のデータ型です。
元となるカラムからそれぞれの非 NULL フィールドにたいし 呼び出される状態推移関数です。 最初の引数として、 sfunc1_return_type 型 の変数を取り、そのフィールドを第二の引数として取ります。
最初の推移関数の戻り型です。
元となるカラムからそれぞれの非 NULL フィールドにたいし 呼び出される状態推移関数です。 たった一つの引数として、 sfunc1_return_type 型 の変数をとり、同じ型の変数を戻します。
二番目の推移関数の戻り型です。
すべての入力フィールドが考察されたあとに呼ばれる最終の関数です。 この関数は sfunc1_return_type と sfunc2_return_type の二つの型の引数を取らなければなりません。
最初の推移関数の引数の初期値です。
二番目の推移関数の引数の初期値です。
CREATE AGGREGATE は、ユーザまたはプログラマが 新規の集約関数を定義するこで Postgres の 機能を拡張できるようにします。 min(int4) や avg(float8) と いったいくつかの基本型用の集約関数は基本の配布物として提供されて います。新しい型を定義したい場合とか、用意されていない集約関数が 必要になった時には、CREATE AGGREGATE によって 欲しい機能を実現することができます。
一つの集約関数には、最大で3つの関数を持つことができます。 内 2 つは状態推移関数である、次の sfunc1 と sfunc2 です。
sfunc1( internal-state1, next-data_item ) ---> next-internal-state1 sfunc2( internal-state2 ) ---> next-internal-state2そして最後の 1 つは、演算関数
ffunc(internal-state1, internal-state2) ---> aggregate-valueとなります。
Postgres は (ここでは temp1 と temp2 になっている) 推移関数に対する引数として使用する中間結果を保持する最大 2 つの暫定 変数を生成します。
これらの推移関数には以下の特性が必要です。
sfunc1 の引数は 型 sfunc1_return_type の temp1 と 型 data_type の column_value で なくてはなりません。 戻り値は、型 sfunc1_return_type であって、次の sfunc1 呼び出しの 第一の引数でなければなりません。
sfunc2 の 引数と戻り値は、 型 sfunc2_return_type の temp2 でなくては なりません。
最終演算関数の引数は temp1 と temp2 であって、戻り値は Postgres の基準型でなければなりません。 (BASETYPE で指定される data_type である必要はありません。)
2 つの状態推移関数が指定されたときのみ、 FINALFUNC が指定されなければなりません。
また、集約関数はそれぞれの推移関数に対して 1 つづつ、全体として1 つ または 2 つの初期条件が必要なことがあります。これらはデータベースで型 text のフィールドとして指定され、記憶されます。
集約関数を削除するのには、 DROP AGGREGATE を使用します。
状態関数と最終関数の組合せが異なる集約関数を指定することが できます。 例えば、count 集約は SFUNC1 または FINALFUNC ではなく(増分関数である) SFUNC2 を必要とします。 一方、 sum 集約は SFUNC2 または FINALFUNC ではなく(加算関数である) SFUNC1 を必要とし、avg 集約は結果を引き出すのに、上記 2 つの関数と(除算関数である) FINALFUNC を必要とします。いずれの場合においても、最低 1 つの 状態関数を定義する必要があり、全ての SFUNC2 は、それに相応する INITCOND2 がなければなりません。