create aggregate - 新しい集約関数を定義する
create aggregate 集合名 [as]
([sfunc1 = 状態遷移関数1
, basetype = データ型
, stype1 = 状態遷移関数1の返り値の型]
[, sfunc2 = 状態遷移関数2
, stype2 = 状態遷移関数2の返り値の型]
[, finalfunc = 最終関数]
[, initcond1 = 初期状態1]
[, initcond2 = 初期状態2])
集約関数は 3 つまでの関数が使用できる。2 つの状態遷移関数 X1 と X2 は、
X1( 内部状態1, 次のデータ項目 ) ---> 次の内部状態1
X2( 内部状態2 ) ---> 次の内部状態2
であり、 最終計算 関数 F は、
F(内部状態1, 内部状態2) ---> 集合値
といった形態をしている。これらの関数は、以下の構造をしている必要がある。
であり、返り値は stype1 でなければならない。
でなければならない。
であり、返り値は POSTGRES のベース型でなければならない(basetype と同じである必要はない)。
状態の結合や最終関数が変化するような集約関数を指定することも可能であることに注意すること。たとえば、 "count" 集約関数は sfunc2
(インクリメントしてゆくような関数)を必要とするが、 sfunc1 or finalfunc
は必ずしもそうでなくてもよい、とか、"average" 集約関数は上の 2つの状態関数のみならず、答えを生成するための 最終関数
も必要とする、などである。いかなるケースにおいても、少なくとも 1 つの状態関数が定義されなければならず、また sfunc2
はそれに対応する initcond2
を持たなければならない。
集約関数はまた、各遷移関数に対する 2 つの初期状態を必要とする。これらは、指定されるとデータベースにtext型フィールドとして格納される。集約関数は、加算関数とインクリメント関数という 2 つの状態遷移関数を持つ。これらの関数は合計を計算し、出現した値の件数をカウントすることにより集合の内部状態を変更する。具体的には、新しい従業員の給与を受け取ってカウントをインクリメントし、新しい給与を加算して次の状態を作る。状態遷移関数には正しい初期値が与えられなければならない。その後、最終計算により合計を件数で割って、最終的な答えが得られる。
--
-- int4 の平均を取る集約関数を生成する
--
create aggregate avg (sfunc1 = int4add, basetype = int4,
stype1 = int4, sfunc2 = int4inc, stype2 = int4,
finalfunc = int4div, initcond1 = 0, initcond2 = 0)
堀田 倫英 <hotta@net-newbie.com>