Window - スクリプト関数
Window() は、完全なテーブルのセクション (または「ウィンドウ」) の複数の行から計算を実行し、行ごとに 1 つの値を生成します。
Window 関数を使用して、次の操作を実行できます。
-
行内の個々の数値を、テーブルのウィンドウ内の平均、最大値、または最小値と比較します。
-
ウィンドウ内またはテーブル全体内で個々の値のランクを計算します。
Window 関数はテーブル内のレコード数を変更しませんが、集計関数、関係関数、範囲関数と同様のタスクを実行できます。
Window 関数は、操作しているテーブルの LOAD ステートメント内に含めるか、Resident LOAD などでテーブルを参照する必要があります。この例は例 - 集計を含む項目の追加を参照してください。
名前は省略できますが、その場合、項目名が Window 関数式全体に設定されます。たとえば、AvgDepSalary は次の例のようになります。
Window 関数には項目名を付けることをお勧めします。
Window は、丸めや基本的な数値演算などの一般的な関数をサポートします。例:
Window 関数はテーブル全体をスキャンします。メモリ消費の観点から見ると、このスキャンのコストはテーブル内の項目の数に比例します。Window 関数が動作する項目以外の項目がいくつかあるテーブルは、多くの項目があるテーブルよりも常に優先されます。
通常、Window 関数は、同じ集計、Where 句 (フィルター)、Group by 句 (パーティション)、Order by 句 (ソート) を含む同様のスクリプト操作と比較すると、2 ~ 4 倍のメモリを消費し、リロード時間も 2 ~ 4 倍長くなります。
構文:
返されるデータ型: 行ごとに 1 つの値。この値は、別の式と組み合わせたり、別の式で使用したり、LOAD ステートメントによって作成された結果のテーブルに直接追加したりできます。
引数:
引数 | 説明 |
---|---|
main_expr | 関数によって計算され、返される主な入力式です。Median(Salary) など、集計に基づく任意の式である必要があります。例: Window(Median(Salary)) as MedianSalary 数式は、集計が適用されない項目名とすることもできます。この場合、Window はその項目に Only() 関数が適用されるかのように扱います。例: Window(Salary) as WSalary Window(Sum(Avg(Salary))) やWindow(Sum(Window(Salary))) などのネストされた集計またはネストされたウィンドウ関数を含む数式は許可されません。 |
partition1, partition2 | main_expr の後は、任意の数のパーティションを定義できます。パーティションは、集計を適用する組み合わせを定義する項目です。例: Window(Avg(Salary), Department) as AvgDepSalary 各部門の平均給与を計算します。 複数のパーティション パラメーターが指定されている場合、パーティション 項目の一意の組み合わせを持つ各行に集計が適用されます。例: Window(Avg(Salary), Department, Country) as AvgDepSalaryPerCountry 各国の各部門の平均給与を計算します。スウェーデンのマーケティングとカナダのマーケティングなど、異なる国での重複した部門は、異なるパーティションとして扱われます。 パーティショニングは、group by 句によるグループ化と似ています。ただし、パーティショニングによって、入力テーブルと比較したレコード数は減りません。 |
sort_type, [sort_expr] | 必要に応じて、ソート タイプとソート数式を指定します。これは、集計が実行される順序を定義します。sort_type は定数文字列であり、次の 3 つの値のいずれかを取ることができます。
sort_type ASC または DESC を定義する場合は、ソート数式を定義する必要があります。sort_type NONE の場合、ソート数式を指定する必要はありません。ソート数式は、パーティション内の行の順序を決定します。 例: Window(RecNo(), Department, 'ASC', Year) 上記の例では、パーティション内の集計は Year 項目の昇順で実行されます。 ソート パラメーターは、スライディング ウィンドウがテーブルを処理する順序にも影響します。例は、例 - ソートされたスライディング ウィンドウを使用した項目の追加をご覧ください。 |
filter_expr | 必要に応じて、フィルター式を追加します。これは、レコードを計算に含めるかどうかを決定するブール式です。 filter_expr が指定されている場合は、ソート タイプを含める必要があります。ソート タイプが定義されていない場合、引数はソート数式ではなくパーティション パラメーターとして解釈されます。filter_expr パラメーターは完全に省略することも、真の値を含めることもできます。どちらもフィルターを使用しないため、除外される行はありません。 例: Window(avg(Salary), Department, 'ASC', Age, Country='US' Or Country='Canada') as AvgDepSalaryInUsOrCanada 上記の Window ステートメントは、Country項目が US または Canada でない行をフィルタリングし、それらの行を集計から除外します。フィルタリングで除外された行の出力値は残りますが、他のすべての出力行と同様に、フィルタリングによって除外されていない行の集計結果のみが含まれます。 |
start_expr,end_expr | 必要に応じて、スライディング ウィンドウ機能の引数を設定します。これにより、集計される行数がさらに制限されます。各出力行には、現在の行の前と後のいくつかの行からの (集計された) 結果のみが含まれます。スライディング ウィンドウには 2 つの引数 (start_expr,end_expr) が必要です。これらの引数が指定されている場合は、ソート タイプをスキップしないでください。スキップすると、引数はスライディング ウィンドウではなくパーティション パラメーターとして解釈される可能性があります。パラメーター start_expr,end_expr は次のもので構成されます。
例えば、前の 3 行、現在の行、次の行を含める場合は、次のようになります。 Window(concat(Text(Salary),'-'), Department, 'NONE', 1, -3, 1) as WSlidingSalaryDepartment 先行するすべての行、または後続のすべての行を表示するには、Unbounded() 関数を使用できます。例えば、前の行、現在の行、次の行をすべて含める場合は、次のようになります。 Window(concat(Text(Salary),'-'), Department, 'NONE', 1, UNBOUNDED(), 1) as WSlidingSalaryDepartment 例えば、現在の行から 3 行目以降のすべての行を含める場合は、次のようになります。 Window(concat(Text(Salary),'-'), Department, 'NONE', 1, 3, UNBOUNDED()) as WSlidingSalaryDepartment 上記の例では、スクリプトがパーティション引数とソート タイプの後に続くパラメータを区別できるように、ソート タイプ NONE が指定されています。 |
例 - 集計を含む項目の追加
例 - 特定の値でフィルタリングされた集計を含む項目の追加
例 - スライディング ウィンドウを使用した項目の追加
制限事項
Window には次の制限があります。
Window はリソースを大量に消費する機能であり、特にメモリの消費量が大きくなります。
Window は Qlik Sense Mobile には対応していません。
チャートの数式は Windowをサポートしていません。
Window 関数を他の Window 関数内にネストすることはできません。
Window は集計関数内では使用できません。
Window は、group by 句を含む Load ステートメントでは使用できません。
Window はテーブル全体をスキャンできる必要があります。
スライディング ウィンドウ機能を使用する場合、WRank()、RecNo()、RowNo() は Window と一緒に使用できません。
スライディング ウィンドウ機能を使用すると、ウィンドウのサイズに応じて計算時間が増加します。一般的に、大きなテーブルと大きなウィンドウ サイズの組み合わせは避けるべきです。