CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type [ , FINALFUNC = ffunc ] [ , INITCOND = initial_condition ] )
CREATE AGGREGATEは、新しい集約関数を定義します。 配布物には基本的、かつ、よく使用される集約関数がいくつか含まれており、項9.15に文書化されています。 もし新しい型を定義するかまだ提供されていない集約関数が必要な場合、必要な機能を提供するために CREATE AGGREGATEを使うことができます。
スキーマ名が付けられている場合 (例えば、CREATE AGGREGATE myschema.myagg ...)、集約関数は指定されたスキーマで作成されます。 スキーマ名がなければ、集約関数は現在のスキーマで作成されます。
集約関数は名前と入力データ型によって識別されます。 異なる入力型の演算をするのであれば、同じスキーマ内の2つの集約が同じ名前であっても構いません。 集約の名前および入力データ型は、同じスキーマ内の全ての通常の関数の名前および入力データ型とも、違うものにする必要があります。
集約関数は1つか2つの通常の関数から作られます。 状態遷移関数sfuncと省略可能な最終計算関数ffuncです。 これらは以下のように使われます。
sfunc( 内部状態, 次のデータ項目 ) ---> 次の内部状態 ffunc( 内部状態 ) ---> 集約の結果
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のパラメータは、上で示した順番だけではなく、任意の順番で記述することができます。