CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type [ , FINALFUNC = ffunc ] [ , INITCOND = initial_condition ] )
CREATE AGGREGATE は、新しい集約関数を定義します。 標準配布物には、min(integer)やavg(double precision)などいくつかの基本型用の集約関数が既に提供されています。 もし新しい型を定義するかまだ提供されていない集約関数が必要な場合、必要な機能を提供するために CREATE AGGREGATE を使うことができます。
スキーマ名が付けられている場合 (例えば、CREATE AGGREGATE myschema.myagg ...)、集約関数は指定されたスキーマで作成されます。 スキーマ名がなければ、集約関数は現在のスキーマで作成されます。
集約関数は名前と入力データ型によって識別されます。 異なる入力型の演算をするのであれば、同じスキーマ内の 2 つの集約が同じ名前であっても構いません。 集約の名前および入力データ型は、同じスキーマ内のすべての通常の関数の名前および入力データ型とも、違うものにする必要があります。
集約関数は 1 つか 2 つの通常の関数から作られます。 状態遷移関数 sfunc と省略可能な最終計算関数 ffunc です。 これらは以下のように使われます。
sfunc( internal-state, next-data-item ) ---> next-internal-state ffunc( internal-state ) ---> aggregate-value
PostgreSQL は、集約の現在の内部状態を保持する、stypeデータ型の一時変数を作成します。 それぞれの入力データ項目で、状態遷移関数が新しい内部状態値を計算するために呼び出されます。 すべてのデータが処理されると、最終関数が集約の出力値を計算するために 1 回呼び出されます。 もし最終関数がなければ終了時の状態値がそのまま返されます。
集約関数は、内部状態値のための初期値である、初期状態を提供することができます。 これは text 型の列として指定されてデータベースに格納されますが、状態値データ型の定数として有効な外部表現でなければいけません。 もし初期状態が供給されないと、NULL から始まります。
もし状態遷移関数が "厳格" と宣言されると、NULL 入力で呼び出すことはできません。 そのような遷移関数では、集約の実行は以下のようになります。 NULL 入力値が無視されます(その関数は呼び出されず前の状態値が持存します)。 もし初期状態値が NULL だと、最初の非 NULL 入力値が状態値を置き換え、遷移関数は 2 番目の非 NULL 入力値から呼び出しが始まります。 これは max のような集約の実装には便利です。 このような動作は state_data_type が input_data_type と同じ時にのみ有効になることに注意してください。 これらの型が異なる時は、非 NULL 初期値を供給するか厳格でない遷移関数を使わなければいけません。
状態遷移関数が厳格ではない場合、それぞれの入力値で無条件に呼び出され、NULL 入力とNULL 遷移値を自分で処理しなければいけません。 これにより、集約の作成者は集約の NULL 値の扱いについて完全に管理することができます。
もし最終関数が "厳格" と宣言されると、終了状態値が NULL の場合には呼び出されません。 代わりに NULL という結果が自動的に出力になります。 (もちろんこれは厳格な関数のただ一般的な動作でしかありません。) どのような場合でも最終関数は NULL を返すことができます。 例えば、avg の最終関数は入力が0行だとわかると NULL を返します。
作成する集約関数の名前です (スキーマ修飾名も可能)。
この集約関数が演算する入力データ型です。 これは、入力値を検査しない集約には "ANY" として指定することができます (例えば count(*))。
それぞれの入力データ値に対して呼び出される状態遷移関数の名前です。 これは通常は 2 つの引数を持ち、最初の引数は state_data_type 型で 2 番目は input_data_type型です。 代わりに、入力値を検査しない集約ではこの関数は state_data_type 型の引数を1つだけとります。 どちらの場合でも、この関数は state_data_type 型の値を返さなければなりません。 この関数は現在の状態値と現在の入力データ項目を受け取り、次の状態値を返します。
集約の状態値のデータ型です。
すべての入力データに対する処理をし終わってから、集約の結果を計算するために呼ばれる最後の関数の名前です。 この関数は state_data_type 型の引数を 1 つとらなくてはいけません。 集約の出力データ型はこの関数の返り値として定義されます。 ffunc が指定されない場合には、終了時の状態値が集約の結果として使われ、出力型は state_data_type になります。
状態値の初期設定です。 これはデータ型 state_data_type として受け入れられる文字列定数でなければいけません。 もし指定されないと、状態値は NULL から始まります。
CREATE AGGREGATEのパラメータは、上で示した順番だけではなく、任意の順番で記述することができます。