Window 句
12 以上の分析関数が、ORDER BY の一部として window 句を受け付けます。この機能は、これらの関数を説明するセクションに記載されています。COUNT は、window 句がどのように機能するかを説明するために使用されています。
window 句の構文は次のとおりです。
{ {ROWS | RANGE}{ {BETWEEN {UNBOUNDED PRECEDING | CURRENT ROW | value_expr {PRECEDING | FOLLOWING} } AND {UNBOUNDED FOLLOWING | CURRENT ROW | value_expr {PRECEDING | FOLLOWING} }|
{UNBOUNDED PRECEDING | CURRENT ROW | value_expr PRECEDING} }}
次のセクションでは、window 句の詳細について説明します。
| • | デフォルトの前提 |
| • | RANGE と現在の行 |
| • | 論理オフセットとしての RANGE |
| • | ROWS と現在の行 |
| • | ROWS とフレームの最大サイズ |
| • | AVG |
デフォルトの前提
RANGE UNBOUNDED PRECEDING は、ORDER BY が存在するが window 句が指定されていない場合、デフォルトで想定されます。たとえば、次の 3 つは同等です。
COUNT (*) OVER (ORDER BY hire_date)
COUNT (*) OVER (ORDER BY hire_date RANGE UNBOUNDED PRECEDING)
COUNT (*) OVER (ORDER BY hire_date RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
同様に、ROWS を含む次の 2 つの COUNT 関数は同等です。
COUNT (*) OVER (ORDER BY hire_date ROWS 1 PRECEDING)
COUNT (*) OVER (ORDER BY hire_date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
RANGE と現在の行
以下の COUNT の例では、ウィンドウフレームに現在の行、その前のすべての行、およびすべてのタイが含まれています。最初の 3 人の従業員が同じ日に雇用された場合、返されるカウントは 3 になります。
COUNT (*) OVER (ORDER BY hire_date RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
同様に、現在の行が採用日で並べ替えられて 2番目と 3番目の従業員に移動した場合、ウィンドウフレームには引き続き 3 つの行が含まれるため、どちらの場合も関数の結果は 3 になります。
現在の行が進むにつれて、結果のカウントは引き続き従業員数を追跡しますが、別の雇用日タイが発生した場合 (たとえば、9番目と 10番目の従業員)、結果のカウントは両方とも 10 になります。
論理オフセットとしての RANGE
RANGE は論理オフセットであるため、次の 2 つの関数は同等です。フレームには、採用日から 3 日以内の行が含まれています。
COUNT (*) OVER (ORDER BY hire_date RANGE BETWEEN 3 PRECEDING AND 3 FOLLOWING)
COUNT (*) OVER (ORDER BY hire_date RANGE BETWEEN INTERVAL ‘3’ days PRECEDING AND INTERVAL ‘3’ days FOLLOWING)
「間隔」構文では、単位の範囲 (たとえば、年) を拡張でき、行数を超えるフレームサイズの基準が追加されます。
ROWS と現在の行
RANGE の代わりに ROWS が指定されている場合、COUNT は ROW_NUMBER と同じように動作します。つまり、ROWS は現在の行のオフセットのみを処理します。このような COUNT の例は次のとおりです。
COUNT (*) OVER (ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
ROWS とフレームの最大サイズ
フレームサイズを制限する COUNT 関数の例は次のとおりです。
COUNT (*) OVER (ORDER BY hire_date ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING)
現在の行が最初の従業員の場合、フレームサイズは 4 です (現在の行に 3 を加えたもの)。現在の行がテーブル内を移動すると、フレームサイズは 7 に拡大できます。現在の行がテーブルの最後に近づくと、フレームサイズは 4 に戻ります。ROWS では、タイはフレームサイズに影響を与えません。結果のカウント。
ROWS はデータセットの外側を指し、ゼロの結果を返すことができます。たとえば、フレームが空であるため、現在の行がテーブルの最初の行である場合、次の関数は 0 を返します。
COUNT (*) OVER (ORDER BY hire_date ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING)
注:この例では、現在の行がゼロ以外のカウントを返すのに十分な距離にある場合でも、すべての行が現在の行の前にあるため、現在の行は含まれません。