ウィンドウ関数ウィンドウ関数は現在の行に何らかとも関係するテーブル行の集合に渡って計算を行います。これは集約関数により行われる計算の形式と似たようなものです。言っても、通常の集約関数とは異なり、ウィンドウ関数の使用は単一出力行に行をグループ化しません。行はそれぞれ個別の身元を維持します。裏側では、ウィンドウ関数は問い合わせ結果による現在行だけでなく、それ以上の行にアクセスすることができます。これはその部署の平均給与とそれぞれの従業員の給与をどのように比較するかを示した例です。rows)最初の3つの出力列は、テーブルempsalaryから直接もたらされ、テーブル内のそれぞれの行に対し1つの出力行が存在します。4番目の列は、現行の行と同じdepnameの値を持つ全てのテーブル行に渡って取得した平均値を表わしています。(これは実際、通常のavg集約関数と同じですが、OVER句によりウィンドウ関数として扱われ、行の適切な集合に渡り計算されます。)ウィンドウ関数呼び出しは常に、ウィンドウ関数名と引数に直接伴われたOVER句を含みます。これが通常関数、または集約関数と構文的に区別されるところです。OVER句は、ウィンドウ関数により処理のため問い合わせの行がどのように分解されるかを厳密に決定します。BY式の同じ値を共有するグループ、すなわちパーティションに分割する指定を行います。それぞれの行に対し、ウィンドウ関数は現在行と同じパーティションに分類される行に渡って計算されます。BYを使用することによりウィンドウ関数で処理される行の順序を制御することもできます。BYは行が出力される順序に一致する必要すらありません。BY句で定義された順序で生成します。rankは明示的なパラメータを必要としません。この動作はOVER句により完全に決定されるためです。BY、およびHAVING句でフィルターをかけられた問い合わせのFROM句によって生成された"仮想テーブル"です。WHERE条件に一致しないため削除された行はウィンドウ関数では見つけることができません。異なったOVER句を用いて、異なった方法によりデータを分割する複数のウィンドウ関数を問い合わせが含んでも構いません。この仮想テーブルで定義された行の同一の集まり上で全てが作動します。BYは、行の順序付けが重要でない場合割愛可能であることを見てきました。BYも同様に割愛することができます。この場合、全ての行を含むたった一つのパーティションが存在します。ウィンドウ関数に関連したその他の重要な概念があります。それぞれの行に対して、そのウィンドウフレームと呼ばれる、そのパーティション内の行の集合が存在します。多くの(しかしすべてではありません)ウィンドウ関数は、パーティション全体ではなく、ウィンドウフレームの行のみに対して作用します。BY句に従って現在の行と等しい行から構成されます。BYが省略された場合、デフォルトのフレームはそのパーティション内のすべての行を含みます。sumを使用した例を示します。BYが存在しませんので、ウィンドウフレームはパーティションと同一です。BYもありませんのでテーブル全体となります。言い換えると、総和はそれぞれ、テーブル全体に対して行われ、その結果、各出力行で同じ結果を得ることになります。BY句を加えると、非常に異なる結果を得ます。rows)ここで、sumは最初の(最も低い)salaryから現在の行まで、現在のものと重複する全てを含んで、計算されます(重複するsalaryに対する結果に注意してください)。BY句に限って許可されます。BY、HAVING、およびWHEREのような句の中では禁止されています。その理由は、ウィンドウ関数は論理的に、ここに挙げたような句が処理された後に実行されるからです。ウィンドウ関数は通常の集約関数の後に実行されます。これが意味する所は、ウィンドウ関数の引数に集約関数呼び出しを含めても有効ですが、その逆は成り立たないと言うことです。ウィンドウ演算が行われた後、行にフィルタ処理を行ったりグループ化を行う必要が生じた場合、副問い合わせを使用します。3;上記問い合わせは3より小さいrankを持った内部問い合わせからの行のみを表示します。問い合わせが複数のウィンドウ関数を含む場合、各ウィンドウ関数に異なるOVER句を記述することができます。複数の関数で同じウィンドウ処理動作が必要な場合は重複となり、またエラーを招きがちです。代わりにWINDOW句でウィンドウ処理動作に名前を付け、これをOVER内で参照することができます。マニュアルページにあります。注意[1]ほかの方法でウィンドウフレームを定義するいくつかのオプションがありますが、このチュートリアルでは扱いません。詳細は、項4.2.8を参照してください。