メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

ウィンドウ関数の構文の概要

標準のウィンドウ関数の構文は次のとおりです。

Copy
function (expression) OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list [ frame_clause ] ] )
関数はこのセクションで説明された関数の 1 つの場合、expr_list は次のとおりです。
Copy
expression | column_name [, expr_list ]
また、order_list は次のとおりです。
Copy
expression | column_name [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] [, order_list ]
また、frame_clause は次のとおりです。
Copy
ROWS { UNBOUNDED PRECEDING | unsigned_value PRECEDING | CURRENT ROW } | {BETWEEN { UNBOUNDED PRECEDING | unsigned_value { PRECEDING | FOLLOWING } | CURRENT ROW} AND { UNBOUNDED FOLLOWING | unsigned_value { PRECEDING | FOLLOWING } | CURRENT ROW }}

注記

STDDEV_SAMP および VAR_SAMP は、それぞれ STDDEV および VARIANCE のシノニムです。

引数

function

詳細については、個々の関数の説明を参照してください。

OVER

ウィンドウの指定を定義する句。OVER 句はウィンドウ関数に必須であり、ウィンドウ関数を他の SQL 関数と区別します。

PARTITION BY expr_list

オプション。PARTITION BY 句は結果セットをパーティションに再分割します。これは GROUP BY 句と似ています。パーティション句が存在する場合、関数は各パーティションの行に対して計算されます。パーティション句が指定されていない場合、1 つのパーティションにテーブル全体が含まれ、関数は完全なテーブルに対して計算されます。

ランクづけ関数 DENSE_RANK、NTILE, RANK、および ROW_NUMBER では、結果セットのすべての行でグローバルな比較が必要です。PARTITION BY 句を使用すると、クエリオプティマイザは、パーティションに応じて複数のスライスにワークロードを分散させることにより、個々の集計を並列で実行できます。PARTITION BY 句がない場合、集計ステップを 1 つのスライスで順次実行する必要があり、特に大規模なクラスターではパフォーマンスに大きな悪影響を与えることがあります。

ORDER BY order_list

オプション。ウィンドウ関数は、ORDER BY で順序仕様に従ってソートされた各パーティション内の行に適用されます。この ORDER BY 句は、ウィンドウ関数以外 (OVER 句の外側) の ORDER BY 句とは異なり、完全に無関係です。ORDER BY 句は、PARTITION BY 句なしで使用できます。

ランク付け関数の場合、ORDER BY 句はランク付けの値に使用する基準を特定します。集計関数の場合、パーティションで分割された行は、集計関数がフレームごとに計算される前に順序付けされる必要があります。ウィンドウ関数の種類の詳細については、「ウィンドウ関数」を参照してください。

列識別子または列識別を検証する式は、順序リストで必要とされます。定数も定数式も、列名の代用として使用することはできません。

NULL 値は独自のグループとして扱われ、NULLS FIRST または NULLS LAST オプションに従ってソートおよびランク付けされます。デフォルトでは、NULL 値は昇順ではソートされて最後にランク付けされ、降順ではソートされて最初にランク付けされます。

ORDER BY 句を省略した場合、行の順序は不確定になります。

注記

Amazon Redshift などの並列システムでは、ORDER BY 句がデータの一意および全体の並び順を生成しない場合、行の順序は不確定になります。つまり、ORDER BY 式が重複した値を生成する場合 (部分的ソート)、これらの行の戻り値の順序は Amazon Redshift の実行によって異なることがあります。そのため、ウィンドウ関数は予期しない結果または矛盾した結果を返す場合があります。詳細については、「ウィンドウ関数用データの一意の並び順」を参照してください。

column_name

パーティション分割または順序付けされる列の名前。

ASC | DESC

次のように、式のソート順を定義するオプション:

  • ASC: 昇順 (数値の場合は低から高、文字列の場合は「A」から「Z」など) オプションを指定しない場合、データはデフォルトでは昇順にソートされます。

  • DESC: 降順 (数値の場合は高から低、文字列の場合は「Z」から「A」) 。

NULLS FIRST | NULLS LAST

NULL を NULL 以外の値より先に順序付けするか、NULL 以外の値の後に順序付けするかを指定するオプション。デフォルトでは、NULL は昇順ではソートされて最後にランク付けされ、降順ではソートされて最初にランク付けされます。

frame_clause

集計関数では、ORDER BY を使用する場合、フレーム句は関数のウィンドウで行のセットをさらに絞り込みます。これは、順序付けされた結果内の行のセットを含めるまたは除外する機能を提供します。フレーム句は、 ROWS キーワードおよび関連する指定子で構成されます。

ORDER BY 句が集計関数の OVER 句で使用される場合、フレーム句はランク付け関数に適用されないため必要ありません。ORDER BY 句が集計関数に使用される場合、明示的なフレーム句が必要です。

ORDER BY 句が指定されていない場合、暗黙的なフレームはバインドされません ROWS (BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING と同じ)。

ROWS

この句は、 現在の行からの物理オフセットを指定してウィンドウフレームを定義します。.

この句は、現在のウィンドウの行、または現在の行の値を組み合わせるパーティションを指定します。また、現在の行の前後に配置される行の位置を指定する引数を使用します。すべてのウィンドウフレームの参照点は現在の行です。ウィンドウフレームがパーティションで次にスライドすると、各行は順に現在の行になります。

フレームは、次のように現在の行までと現在の行を含む行の簡易セットである場合があります。

Copy
{UNBOUNDED PRECEDING | offset PRECEDING | CURRENT ROW}

また、次の 2 つの境界の間の行のセットである場合があります。

Copy
BETWEEN {UNBOUNDED PRECEDING | offset { PRECEDING | FOLLOWING } | CURRENT ROW} AND {UNBOUNDED FOLLOWING | offset { PRECEDING | FOLLOWING } | CURRENT ROW}

UNBOUNDED PRECEDING はウィンドウがパーティションの最初の行で開始することを示し、offset PRECEDING はウィンドウが現在の行の前のオフセット値と等しい行数で開始することを示します。デフォルトは UNBOUNDED PRECEDING です。

CURRENT ROW は、ウィンドウが現在の行で開始または終了することを示します。RANGE CURRENT ROW には、ORDER BY 式に従って現在の行と同じ値を持つすべての行が含まれます。

UNBOUNDED FOLLOWING はウィンドウがパーティションの最後の行で終了することを示し、offset FOLLOWING はウィンドウが現在の行の後のオフセット値と等しい行数で終了することを示します。

offset は、現在の行の前後にある物理的な行数を識別します。この場合、offset は、正の数値に評価される定数また式である必要があります。たとえば、5 FOLLOWING は現在の行より 5 行後のフレームを終了します。

BETWEEN が指定されていない場合、フレームは現在の行により暗黙的に区切られます。たとえば、ROWS 5 PRECEDINGROWS BETWEEN 5 PRECEDING AND CURRENT ROW と等しく、ROWS UNBOUNDED FOLLOWINGROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING と等しくなります。

注記

開始境界が終了境界よりも大きいフレームを指定することはできません。例えば、これらのフレームはいずれも指定することができません。

Copy
between 5 following and 5 preceding between current row and 2 preceding between 3 following and current row

このページの内容: