ウィンドウ関数

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

# 9.19. ウィンドウ関数

ウィンドウ関数は現在の問い合わせ行に関連した行集合に渡っての計算処理機能を提供します。この機能の手引きは項3.5を参照してください。

組み込みウィンドウ関数は表9-44に一覧されています。これらの関数は必ずウィンドウ関数構文で呼び出されなければなりません。つまり、`OVER`句が必要です。

これら関数に加え、どんな組み込み、またはユーザ定義の集約関数もウィンドウ関数として使用できます（組み込み集約関数一覧は項9.18を参照）。集約関数は、呼び出しの後`OVER`句が続いた場合のみウィンドウ関数として動作します。それ以外、通常の集約関数として動作します。

表 9-44. 汎用ウィンドウ関数

関数 | 戻り値 | 説明
--- | --- | ---
`row_number()` | `bigint` | 1から数えたパーティション内の現在行の数
`rank()` | `bigint` | ギャップを含んだ現在行の階層で、その最初の（対となる）ピアの`row_number`と同一
`dense_rank()` | `bigint` | ギャップを含まない現在行の階層で、この関数は（対となる）ピアグループ数を計算する
`percent_rank()` | `double precision` | 現在行の相対順位。 (`rank` - 1) / (総行数 - 1)
`cume_dist()` | `double precision` | 現在行の相対順位。 (先行する行または現在の行を持つピアの番号) / (total rows)
`ntile(`num_buckets` `integer`)` | `integer` | できるだけ等価にパーティションで割り算した、1から引数値までの整数
`lag(`value` `any` [, `offset` `integer` [, `default` `any` ]])` | ``value`と同じ型` | パーティション内の現在行以前の`offset`行である行で評価された`value`を返します。該当する行がない場合、その代わりとして`default`を返します。`offset`と`default`は共に現在行について評価されます。省略された場合、`offset`は1となり、`default`はNULLになります。
`lead(`value` `any` [, `offset` `integer` [, `default` `any` ]])` | ``value`と同じ型` | パーティション内の現在行以降の`offset`行である行で評価された`value`を返します。該当する行がない場合、その代わりとして`default`を返します。`offset`と`default`は共に現在行について評価されます。省略された場合、`offset`は1となり、`default`はNULLになります。
`first_value(`value` `any`)` | ``value`と同じ型` | ウィンドウフレームの最初の行である行で評価された`value` を返す
`last_value(`value` `any`)` | ``value`と同じ型` | ウィンドウフレームの最後の行である行で評価された`value` を返す
`nth_value(`value` `any`, `nth` `integer`)` | ``value`と同じ型` | ウィンドウフレームの（１から数えて）`nth`番目の行である行で評価された`value`を返す。行が存在しない場合はNULLを返す

表9-44に列挙された関数はすべて、対応するウィンドウ定義の`ORDER BY`句で指定されるソート順に依存します。 `ORDER BY`順で重複する行はピアと呼ばれます。 4つの順位付け関数は、任意の2つのピア間で同じ答えになるように定義されています。

`first_value`、`last_value`、`nth_value`関数は"ウィンドウフレーム"内の行のみを考慮することに注意してください。 デフォルトで、ウィンドウフレームにはパーティションの先頭から現在の行の最終ピアまでの行が含まれます。 これは`last_value`、または時々`nth_value`では有用ではない結果を得ることになりがちです。 `OVER`句に適切なフレーム指定(`RANGE`もしくは`ROWS`)を加えることで、フレームを再定義することができます。 フレーム指定についての詳細は項4.2.8を参照してください。

集約関数をウィンドウ関数として使用する場合、現在の行のウィンドウフレーム内の行に渡って集約処理を行います。 `ORDER BY`を付けた集約、および、デフォルトのウィンドウフレーム定義では、"中間和"のような動作を行います。 これが望まれる場合もあれば、望まれない場合もあります。パーティション全体に渡る集約処理を行うためには、`ORDER BY`を省略するか`ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING`を使用してください。他ののフレーム指定を使用することで様々な結果を得ることができます。

> 注意: SQL標準は、`lead`、`lag`、`first_value`、`last_value`、および`nth_value`に対し`RESPECT NULLS`、または`IGNORE NULLS`オプションを定義します。これはPostgreSQLに実装されていません。動作は常に標準のデフォルトと同一です。つまり、`RESPECT NULLS`です。同様にして、標準の`nth_value`に対する`FROM FIRST`、または`FROM LAST`オプションは実装されていません。デフォルトの`FROM FIRST`動作のみに対応しています。（`ORDER BY`順序付けを逆に行うことで、`FROM LAST`の結果を得ることができます。）

前のページ | ホーム | 次のページ
集約関数 | 上に戻る | 副問い合わせ式