SELECT 文で、AVG や RANK などの Window 関数を使用するウィンドウの全体または一部を定義するには、WINDOW 句を使用します。
WINDOW window-expression, ...
window-expression : new-window-name AS ( window-spec )
window-spec : [ existing-window-name ] [ PARTITION BY expression, ... ] [ ORDER BY expression [ ASC | DESC ], ... ] [ { ROWS | RANGE } { window-frame-start | window-frame-between } ]
window-frame-start : { UNBOUNDED PRECEDING | unsigned-integer PRECEDING | CURRENT ROW }
window-frame-between : BETWEEN window-frame-bound1 AND window-frame-bound2
window-frame-bound : window-frame-start | UNBOUNDED FOLLOWING | unsigned-integer FOLLOWING
PARTITION BY 句 PARTITION BY 句は、指定した式のユニークな値に基づいて、結果セットを論理グループに構築します。Window 関数を使用してこの句を使用する場合、関数は独立して各パーティションに適用されます。たとえば、カラム名が指定された PARTITION BY に従う場合、結果セットはカラムの個別の値によってパーティション化されます。
この句を省略すると、全体の結果セットはパーティションとして扱われます。
PARTITION BY expression には、整数リテラルを使用できません。
ORDER BY 句 ORDER BY 句は、結果セットの各パーティションのローをソートする方法を定義します。さらに、昇順の場合は ASC (デフォルト)、降順の場合は DESC を指定して順序を制御することができます。
ORDER BY expression には、整数リテラルを使用できません。
この句が省略されると、SQL Anywhere は最も効率的な順序でローを返します。そのため、ローに最後にアクセスした日時によって、結果セットでの表示順序が異なることがあります。
ROWS 句と RANGE 句 ROWS 句または RANGE 句を使用して、ウィンドウのサイズを表します。ウィンドウ・サイズは、パーティションの 1 つのロー、複数のロー、またはすべてのローに設定できます。ウィンドウ・サイズは、現在のローの値からのオフセットとしてデータ値の範囲を指定するか (RANGE)、現在のローからの物理的なロー数としてオフセットを指定する (ROWS) ことで表すことができます。
RANGE 句を使用する場合は、範囲計算で値の格納が必要になるため、ORDER BY も指定する必要があります。範囲のための ORDER BY 句には式が 1 つ含まれていること、およびその式の結果が日付または数値になることが必要です。
ROWS 句または RANGE 句を指定しなかった場合、データベース・サーバは、ORDER BY 句が指定されているかどうかに基づいて、デフォルトのウィンドウ・サイズを使用します。デフォルトの詳細については、ウィンドウの定義を参照してください。
PRECEDING 句 PRECEDING 句は、現在のローを参照ポイントとして使用して、ウィンドウの最初のローを定義するときに使用します。開始ローは、現在のローの前にあるロー数で表します。たとえば、5 PRECEDING
と設定すると、ウィンドウは現在のローの前にある 5 番目のローから開始されます。
UNBOUNDED PRECEDING は、ウィンドウの最初のローを設定し、パーティションの最初のローにするときに使用します。
BETWEEN 句 BETWEEN 句は、現在のローを参照ポイントとして使用して、ウィンドウの最初のローと最後のローを定義するときに使用します。最初のローと最後のローは、それぞれ現在のローの前にあるロー数と後にあるロー数で表します。たとえば、BETWEEN 3 PRECEDING AND 5 FOLLOWING
と設定すると、ウィンドウは現在のローの前にある 3 番目のローから開始され、現在のローの後の 5 番目のローで終了します。
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING は、ウィンドウの最初のローと最後のローを設定することで、それぞれパーティションの最初のローと最後のローにするときに使用します。これは ROW 句や RANGE 句を指定する場合のデフォルト動作と同じです。
FOLLOWING 句 FOLLOWING 句は、現在のローを参照ポイントとして使用して、ウィンドウの最後のローを定義するときに使用します。最後のローは、現在のローの後にあるロー数で表します。
UNBOUNDED FOLLOWING は、ウィンドウの最後のローを設定し、パーティションの最後のローにするときに使用します。
WINDOW 句は、SELECT 文の ORDER BY 句の前に指定する必要があります。
LIST 関数には例外がありますが、すべての集合関数を Window 関数として使用できます。ただし、ランキング集合関数 (RANK、DENSE_RANK、PERCENT_RANK、CUME_DIST、ROW_NUMBER) には ORDER BY 句が必要です。また、WINDOW 句やインライン定義には ROW 句と RANGE 句は使用できません。それ以外の Window 関数では、任意の句を使用できます。
目的の結果を得るためのウィンドウの定義および使用の詳細については、ウィンドウの定義とウィンドウ定義:インラインおよび WINDOW 句を参照してください。
SQL/2003 SQL/2003 機能 T611、T612。
次の例は、選択した州に在住する全従業員について、各従業員の給料と平均給料を返します。結果は State、Surname の順にソートされます。
SELECT EmployeeID, Surname, Salary, State, AVG( Salary ) OVER SalaryWindow FROM Employees WINDOW SalaryWindow AS ( PARTITION BY State ) ORDER BY State, Surname; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |