集約関数

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

# 9.18. 集約関数

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

表 9-42. 汎用集約関数

関数 | 引数のデータ型 | 戻り値型 | 説明
--- | --- | --- | ---
`array_agg(`expression`)` | any | 引数型の配列 | 配列に連結されたNULLを含む入力値
`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`の最小値
`string_agg(`expression`, `delimiter`)` | `text`, `text` | `text` | 入力された値が指定したデリミタで区切られた一つの文字列に連結されます。
`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 ...;

> ここで、副問い合わせが論理値での１行を返す場合、`ANY`は副問い合わせを導入するもの、もしくは集約関数であるものいずれかとみなすことができます。 従って、これらの集約関数に標準の名前を付けることはできません。

> 注意: 他のSQLデータベース管理システムでの作業に親しんだユーザは、`count`集約関数がテーブル全体に適用される場合の性能に失望するかも知れません。

>     SELECT count(*) FROM sometable;

> のような問い合わせはテーブル全体を逐次スキャンを用いてPostgreSQLにより実行されます。

集約関数`array_agg`と`string_agg`、および`xmlagg`、そして類似のユーザ定義の集約関数は、入力値の順序に依存した意味のある別の結果値を生成します。この並び順はデフォルトでは指定されませんが、項4.2.7に記述されているように、集計呼び出し中に`ORDER BY`句を書くことで制御可能となります。別の方法として、並び替えられた副問い合わせから入力値を供給することでも上手くいきます。例をあげます。

    SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;

しかしこの構文はSQL標準では許されておらず、他のデータベースシステムに移植性はありません。

統計解析処理によく使用される集約関数を表9-43に示します。 （これらは、より一般的に使用される集約関数との混乱を防ぐために別出ししました。） 説明の部分における`N`は、すべての入力式が非NULLの入力行の個数を表します。 すべての場合にて、例えば`N`が0の時など計算が無意味である場合にはNULLが返されます。

表 9-43. 統計処理用の集約関数

関数 | 引数の型 | 戻り値の型 | 説明
--- | --- | --- | ---
`corr(`Y`, `X`)` | `double precision` | `double precision` | 相関係数
`covar_pop(`Y`, `X`)` | `double precision` | `double precision` | 母共分散
`covar_samp(`Y`, `X`)` | `double precision` | `double precision` | 標本共分散
`regr_avgx(`Y`, `X`)` | `double precision` | `double precision` | 独立変数の平均値 (`sum(`X`)/`N``)
`regr_avgy(`Y`, `X`)` | `double precision` | `double precision` | 依存変数の平均値 (`sum(`Y`)/`N``)
`regr_count(`Y`, `X`)` | `double precision` | `bigint` | 両式が非NULLとなる入力行の個数
`regr_intercept(`Y`, `X`)` | `double precision` | `double precision` | (`X`, `Y`)の組み合わせで決まる、線型方程式に対する最小二乗法のY切片
`regr_r2(`Y`, `X`)` | `double precision` | `double precision` | 相関係数自乗値
`regr_slope(`Y`, `X`)` | `double precision` | `double precision` | `X`, `Y`)の組み合わせで決まる、最小自乗法に合う線型方程式の傾き
`regr_sxx(`Y`, `X`)` | `double precision` | `double precision` | `sum(`X`^2) - sum(`X`)^2/`N`` （依存変数の"二乗和"）
`regr_sxy(`Y`, `X`)` | `double precision` | `double precision` | `sum(`X`*`Y`) - sum(`X`) * sum(`Y`)/`N`` （依存変数×独立変数の"和"）
`regr_syy(`Y`, `X`)` | `double precision` | `double precision` | `sum(`Y`^2) - sum(`Y`)^2/`N`` （独立変数の"自乗和"）
`stddev(`expression`)` | `smallint`、`int`、 `bigint`、`real`、`double precision`、または`numeric` | 浮動小数点型の引数では`double precision`。それ以外では`numeric` | `stddev_samp`の歴史的な別名
`stddev_pop(`expression`)` | `smallint`、`int`、 `bigint`、`real`、`double precision`、または`numeric` | 浮動小数点型の引数では`double precision`。それ以外では`numeric` | 入力値に対する母標準偏差
`stddev_samp(`expression`)` | `smallint`、`int`、 `bigint`、`real`、`double precision`、または`numeric` | 浮動小数点型の引数では`double precision`。それ以外では`numeric` | 入力値に対する標本標準偏差
`variance`(`expression`) | `smallint`、`int`、 `bigint`、`real`、`double precision`、または`numeric` | 浮動小数点型の引数では`double precision`。それ以外では`numeric` | `var_samp`の歴史的な別名
`var_pop`(`expression`) | `smallint`、`int`、 `bigint`、`real`、`double precision`、または`numeric` | 浮動小数点型の引数では`double precision`。それ以外では`numeric` | 入力値に対する母分散（母標準偏差の自乗）
`var_samp`(`expression`) | `smallint`、`int`、 `bigint`、`real`、`double precision`、または`numeric` | 浮動小数点型の引数では`double precision`。それ以外では`numeric` | 入力値に対する標本分散（標本標準偏差の二乗）

前のページ | ホーム | 次のページ
配列関数と演算子 | 上に戻る | ウィンドウ関数