ウィンドウ関数
詳細モードでは、ウィンドウ関数を使用してステートフルな計算を簡潔に表現できます。ウィンドウ関数は、大規模なデータセットから小さいサブセットを取得して、処理と分析を行います。
ウィンドウ関数は、行のグループに対して動作し、各入力行の戻り値を計算します。
ウィンドウ関数を使用して、次のタスクを実行します。
- •アップストリームまたはダウンストリームの行からデータを取得します。
- •行のグループに基づいて累積合計を計算します。
- •行のグループに基づいて累積平均を計算します。
ウィンドウ関数を定義する前に、[ウィンドウ]タブで次のウィンドウプロパティを設定します。
- フレーム
現在の行の位置からの物理オフセットに基づいて、現在の入力行のフレームに含まれる行を定義します。
集計関数をウィンドウ関数として使用する場合は、フレームを構成します。ウィンドウ関数のLEADとLAGは、個々の行を参照し、フレームを無視します。
- パーティションキー
- 入力行を別々のパーティションに分割します。
パーティションキーを定義しない場合は、すべての行が単一パーティションに属します。
- オーダーキー
- パーティション内の行の順序を決定します。
選択するフィールドによって、パーティション内の行の位置が決まります。オーダーキーは昇順または降順にできます。オーダーキーを定義しない場合、行には特定の順序がありません。
ウィンドウ関数を含む式をパラメータ化することはできません。式がパラメータ化されている場合、マッピングタスクでウィンドウ関数を指定することはできません。
フレーム
フレームは、現在の行に対する相対的な位置に基づいて、現在の入力行の計算に含まれる行を決定します。集計関数をウィンドウ関数として使用する場合は、フレームを構成します。
開始オフセットと終了オフセットは、現在の入力行の前後に表示される行の数を表します。オフセット「0」は、現在の入力行を表します。例えば開始オフセットが-3で終了オフセットが0の場合は、現在の入力行と現在の行より前の3つの行を含むフレームを表します。
次の図は、開始オフセットが-1で終了オフセットが1のフレームを示しています。
すべての入力行に対して、関数はフレーム内の行に対して集計操作を実行します。前図のフレームに対してSUMのような集計式を構成する場合、式はフレーム内の値の合計を計算し、入力行に対して値6000を返します。
現在の入力行を含まないフレームを指定することもできます。例えば開始オフセットが10で終了オフセットが15の場合は、現在の入力行より後の10番目の行から15番目の行までの合計6行が含まれるフレームを表します。
[前のすべての行]および[後のすべての行]というオフセットは、パーティションの最初の行とパーティションの最後の行を表します。例えば、開始オフセットが[前のすべての行]で終了オフセットが-1の場合、フレームには現在の行より前の1行と、それより前のすべての行が含まれます。
次の図は、開始オフセットが0で終了オフセットが[後のすべての行]のフレームを示しています。
フレームオフセットがパーティション外部である場合、集計関数はこのフレームを無視します。フレームのオフセットがパーティションまたはテーブルの内部でない場合、集計関数はパーティション内の行のみを処理します。集計関数により、スキップされた行がログファイルに一覧表示されます。この関数は、スキップされた行に対して、デフォルト値のERROR('トランスフォーメーションエラー')、NULL、または事前定義された定数のいずれかの応答を返します。
例えば、テーブルを販売者ID別、オーダーを数量別のパーティションに分けるとします。開始オフセットを-3に設定し、終了オフセットを4に設定します。
次の図に、現在の入力行のパーティションとフレームを示します。
このフレームには、合計8行が含まれますが、計算はパーティション内に留まります。このフレームを使用してAVG関数を定義した場合、この関数はパーティション内の数量の平均を計算し、18.75を返します。
フレームを定義する場合、以下のルールとガイドラインを考慮します。
- •LEADおよびLAGでは、関数の引数で指定するフレームが使用され、[ウィンドウ]タブで設定するフレームは無視されます。
- •開始オフセットは、終了オフセット以下でなければなりません。
パーティションキーおよびオーダーキー
パーティションキーとオーダーキーを構成して、行のグループを形成し、各パーティション内で行の順序またはシーケンスを定義します。
次のキーを使用して、ウィンドウ内の行のグループ化と順序の指定を行います。
- パーティションキー
- すべての行にわたって計算を実行するのではなく、パーティションの境界を定義するようにパーティションキーを設定します。
パーティションキーを指定しない場合は、すべてのデータが同じパーティションに含まれます。
- オーダーキー
- オーダーキーを使用して、パーティション内の行の順序を決定します。オーダーキーは、パーティション内の特定の行の位置を定義します。
また、データを昇順または降順に並べ替える必要もあります。オーダーキーを指定しない場合、パーティション内の行はランダムに並べられます。
パーティションキーとオーダーキーのウィンドウプロパティを定義するときは、次のルールとガイドラインを考慮してください。
- •階層フィールドはパーティションキーまたはオーダーキーとして使用できません。
- •一意のフィールドをパーティションキーおよびオーダーキーとして定義します。
例
あなたはコーヒーと紅茶の店のオーナーです。売り上げが1番目と2番目のコーヒーと紅茶を計算したいと考えています。
以下の表に、製品、対応する製品カテゴリ、および各製品の収益を示しています。
Product | Category | Revenue |
---|
Espresso | Coffee | 600 |
Black | Tea | 550 |
Cappuccino | Coffee | 500 |
Americano | Coffee | 600 |
Oolong | Tea | 250 |
Macchiato | Coffee | 300 |
Green | Tea | 450 |
White | Tea | 650 |
|
カテゴリ別にデータを分割し、収益の降順でデータを並べます。
以下の表は、カテゴリに従って2つのパーティションにグループ化されたデータを示しています。各パーティション内では、収益は降順に編成されます。
Product | Category | Revenue |
---|
Espresso | Coffee | 600 |
Americano | Coffee | 600 |
Cappuccino | Coffee | 500 |
Macchiato | Coffee | 300 |
White | Tea | 650 |
Black | Tea | 550 |
Green | Tea | 450 |
Oolong | Tea | 250 |
|
各パーティション内でMAX関数を実行して、売り上げのよいコーヒーの2つはエスプレッソとアメリカーノであり、売り上げのよいお茶の2つは白茶と紅茶であると判断できます。