無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

9.21. ウィンドウ関数

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

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

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

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

関数 戻り値 説明
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 と同じ型 ウィンドウフレームの(1から数えて) nth 番目の行である行で評価された value を返す。行が存在しない場合はNULLを返す

表9-48 に列挙された関数はすべて、対応するウィンドウ定義の 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 の結果を得ることができます。)


powered by SEO.CUG.NET