集約関数

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 9章関数と演算子 | 早送り | 次のページ

# 9.15. 集約関数

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

表 9-37. 集約関数

関数 | 引数のデータ型 | 戻り値型 | 説明
--- | --- | --- | ---
`avg(`expression`)` | `smallint`、`integer`、`bigint`、 `real`、`double precision`、`numeric`もしくは`interval` | 整数型の引数であれば全て `numeric`、浮動小数点の引数であれば `double precision`、それ以外は引数のデータ型と同じ | 全ての入力値の平均値 (算術平均)
`bit_and(`expression`)` | `smallint`, `integer`, `bigint`, もしくは、 `bit` | 引数のデータ型と同じ | 全ての非NULLの入力値のビット積、非NULLの入力値がなければNULL。
`bit_or(`expression`)` | `smallint`, `integer`, `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`)` | 数値型全て、string、date/time型のいずれか | 引数型と同一 | 全ての入力値間での`expression`の最大値
`min(`expression`)` | 数値型全て、string、date/time型のいずれか | 引数型と同一 | 全ての入力値間での`expression`の最小値
`stddev(`expression`)` | `smallint`、`integer`、 `bigint`、`real`、`double precision`もしくは`numeric` | 浮動小数点の引数であれば`double precision`、それ以外は`numeric` | 入力値の標本標準偏差
`sum(`expression`)` | `smallint`、`integer`、 `bigint`、`real`、`double precision`、`numeric`もしくは`interval` | `smallint`または`integer`型の引数であれば`bigint`、`bigint`型の引数であれば`numeric`、浮動小数点の引数であれば`double precision`、それ以外は引数のデータ型と同じ | 全ての入力値に渡って`expression`の和
`variance`(`expression`) | `smallint`、`integer`、 `bigint`、`real`、`double precision`もしくは`numeric` | 浮動小数点の引数であれば`double precision`、それ以外は`numeric` | 入力値の分散標本 (標本標準偏差の2乗)

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

> 注意: `bool_and`、`bool_or`論理集約関数は標準SQLの集約関数`every`、`any`または`some`に対応します。 `any`と`some`についてですが、標準の構文には曖昧さがあるようです。

>     SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;

> ここで、`ANY`は、副問い合わせの先頭とも、選択式が1行を返すとしたら集約関数とも取ることができます。 従って、標準ではこうした集約関数に名前がありません。

> 注意: 他の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;

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

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

前のページ | ホーム | 次のページ
配列関数と演算子 | 上に戻る | 副問い合わせ式