9.15. 集約関数

集約関数は複数の入力値から単一の結果を計算します。 表9-43に組み込み集約関数を示します。 集約関数の特殊な構文に関する考察は項4.2.7で説明されています。 その他の入門的な情報については、項2.7を参照してください。

表 9-43. 集約関数

関数引数のデータ型返り値型説明
avg(expression) smallintintegerbigintrealdouble precisionnumericもしくはinterval 整数型の引数であればすべて numeric、浮動小数点の引数であれば double precision、それ以外は引数のデータ型と同じ すべての入力値の平均値 (算術平均)
count(*) bigint入力値の総数
count(expression)すべてbigintexpressionが非NULL値を持つ入力値の個数
max(expression)数値型すべて、string、date/time型のいずれか引数型と同一すべての入力値間でのexpressionの最大値 values
min(expression)数値型すべて、string、date/time型のいずれか引数型と同一すべての入力値間でのexpressionの最小値
stddev(expression) smallintintegerbigintrealdouble precisionもしくはnumeric 浮動小数点の引数であればdouble precision、それ以外はnumeric 入力値の標本標準偏差
sum(expression)smallintintegerbigintrealdouble precisionnumericもしくはinterval smallintまたはinteger型の引数であればbigintbigint型の引数であればnumeric、浮動小数点の引数であればdouble precision、それ以外は引数のデータ型と同じ すべての入力値に渡ってexpressionの和
variance(expression) smallintintegerbigintrealdouble precisionもしくはnumeric 浮動小数点の引数であればdouble precision、それ以外はnumeric 入力値の分散標本 (標本標準偏差の2乗)

上記の関数は、count関数を除き、1行も選択されなかった場合NULL値を返すことに注意してください。 特に、行の選択がないsum関数は、予想されるであろうゼロではなくNULLを返します。 必要であれば、NULLをゼロと交換する目的でCOALESCE関数を使うことできます。

注意: 他のSQLデータベース管理システムでの作業に親しんだユーザは、集約がテーブル全体に適用される(言い替えるとWHERE句の指定がない)場合のPostgreSQLの集約関数の性能上の特徴に驚くかもしれません。 具体的には

SELECT min(col) FROM sometable;

という問い合わせは、PostgreSQLではテーブル全体に対する逐次スキャンを使用します。 他のデータベースシステムでは、この形式の問い合わせを列へのインデックスが使用できるのであればそれを使用するように、最適化する可能性があります。 同様に、PostgreSQLでは、テーブル全体に対するmax()およびcount()集約関数は常に逐次スキャンを要求します。

PostgreSQLでは、ユーザ定義の集約問い合わせを可能にするために、この最適化を簡単に実装することはできません。 min()max()およびcount()は集約関数用汎用APIを使用するように定義されているため、特定の環境下における関数実行に対して特別な処理をさせるための用意がありません。

幸いにも、min()およびmax()には簡単な回避方法があります。 以下の問い合わせは上の問い合わせと同じですが、もし問題の列にB-treeインデックスが存在する場合はそれを利用するという利点があります。

SELECT col FROM sometable ORDER BY col ASC LIMIT 1;

(上の問い合わせでASCDESCで置き換えて得られる)同様の問い合わせを使用してmax()を代行することができます。)

残念ながら、テーブル全体を対象としてcount()の性能を向上させるために使用できる、上同様の簡単な問い合わせはありません。