集約関数は複数の入力値から単一の結果を計算します。 表9-42および表9-43に組み込み集約関数を示します。 集約関数の特殊な構文に関する考察は項4.2.7で説明されています
表 9-42. 汎用集約関数
関数 | 引数のデータ型 | 戻り値型 | 説明 |
---|---|---|---|
array_agg(expression)
| any | 引数型の配列 | 配列に連結された入力値 |
avg(expression)
| smallint, int, bigint, real, double precision, numeric, or interval | 整数型の引数であれば全てnumeric、浮動小数点の引数であればdouble precision、それ以外は引数のデータ型と同じ | 全ての入力値の平均値(算術平均) |
bit_and(expression)
| smallint, int, bigint, or bit | 引数のデータ型と同じ | 全ての非NULLの入力値のビット積、非NULLの入力値がなければNULL |
bit_or(expression)
| smallint、int、bigint、または bit | 引数のデータ型と同じ | 全ての非NULLの入力値のビット和、非NULLの入力値がなければNULL |
bool_and(expression)
| bool | bool | 全ての入力が真ならば真、そうでなければ偽 |
bool_or(expression)
| bool | bool | 少なくとも1つの入力値が真ならば真。そうでなければ偽 |
count(*) | bigint | 入力行の数 | |
count(expression) | 全て | bigint | expressionが非NULL値を持つ入力行の個数 |
every(expression)
| bool | bool | bool_and と等価 |
max(expression) | 全ての配列、数値、文字列、または日付時刻型 | 引数の型と同じ | 全ての入力値にわたりexpressionの最大値 |
min(expression) | 全ての配列、数値、文字列、または日付時刻型 | 引数の型と同じ | 全ての入力値にわたりexpressionの最小値 |
sum(expression) | smallint、int、bigint、real、double precision、numeric、またはinterval | smallintまたはint型の引数であればbigint、bigint型の引数であればnumeric、浮動小数点の引数であればdouble precision、それ以外は引数のデータ型と同じ | 全ての入力値に渡りexpressionの和 |
xmlagg(expression)
| xml | xml | XML値の連結( 項9.14.1.7も参照) |
上記の関数は、count
関数を除き、1行も選択されなかった場合NULL値を返すことに注意してください。特に、行の選択がないsum
関数は、予想されるであろうゼロではなくNULLを返し、そしてarray_agg
は、入力行が存在しない場合に、空配列ではなくNULLを返します。必要であれば、NULLをゼロまたは空配列と交換する目的でcoalesce
関数を使うことができます。
注意:
bool_and
、bool_or
論理集約関数は標準SQLの集約関数every
、any
またはsome
に対応します。any
とsome
についてですが、標準の構文には曖昧さがあるようです。SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;ここで、副問い合わせが論理値での1行を返す場合、
ANY
は副問い合わせを導入するもの、もしくは集約関数であるものいずれかとみなすことができます。 従って、これらの集約関数に標準の名前を付けることはできません。
注意: 他のSQLデータベース管理システムでの作業に親しんだユーザは、
count
集約関数がテーブル全体に適用される場合の性能に失望するかも知れません。SELECT count(*) FROM sometable;のような問い合わせはテーブル全体を逐次スキャンを用いてPostgreSQLにより実行されます。
集約関数array_agg
およびxmlagg
、そして類似のユーザ定義の集約関数は、入力値の順序に依存した意味のある結果値を生成します。現在の実装では、入力の順序は基本的に指定されていません。しかし、並び替えられた副問い合わせから入力値を供給しても通常旨く行きます。例をあげます。
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
しかしこの構文はSQL標準では許されておらず、他のデータベースシステムに移植性はありません。PostgreSQLの将来のバージョンで、より良い定義方法(xmlagg(expr ORDER BY expr, expr, ...))で順序を制御する追加機能を提供する予定です。
統計解析処理によく使用される集約関数を表9-43に示します。 (これらは、より一般的に使用される集約関数との混乱を防ぐために別出ししました。) 説明の部分におけるNは、すべての入力式が非NULLの入力行の個数を表します。 すべての場合にて、例えばNが0の時など計算が無意味である場合にはNULLが返されます。
表 9-43. 統計処理用の集約関数