跳到主要內容 跳至補充內容

Window - 指令碼函數

Window() 對完整表格的一個區段 (或「視窗」) 的多列執行計算,並為每一列產生單一值。

您可以使用 Window 函數執行操作,例如:

  • 比較列中的個別數值與表格視窗內的平均、最大或最小值。

  • 計算個別值的排名,視窗內或整個表格內皆可。

Window 函數不會變更表格中的記錄數量,但仍然可以執行與彙總、關係和範圍函數類似的任務。

Window 函數必須包含在您正在使用的表格的 LOAD 陳述式中,或參考該表格 (例如使用 Resident LOAD)。如需範例,請參閱 範例 - 新增包含彙總的欄位

可以省略名稱,但這會導致欄位名稱設定為整個 Window 函數運算式。例如,以下範例中的 AvgDepSalary

[AvgSalary]: Load *, Window(avg(Salary), Department) as AvgDepSalary Resident Employees;
資訊備註

建議向 Window 函數提供欄位名稱。

Window 支援一般函數,例如捨入或基本數字操作。例如︰

Load *, Round(Window(Sum(Salary),Department)) as SumDepSalary
Load *, Window(Sum(Salary),Department) + 5 as SumDepSalary
資訊備註

Window 函數掃描完整表格。從記憶體取用的角度而言,這種掃描的成本與表格中的欄位數量成正比。除了 Window 函數所操作的欄位之外,具有少量欄位的表格一律比具有許多欄位的表格更受歡迎。

通常,相較於包含相同彙總、Where 子句 (篩選條件)、Group by 子句 (分割區) 和 Order by 子句 (排序) 的類似指令碼操作,Window 函數會取用 2-4 倍的記憶體,而且載入時間也會延長 2-4 倍。

語法:  

Window (main_expr, [partition1, partition2, ...], [sort_type, [sort_expr],[filter_expr], [start_expr, end_expr]])

傳回資料類型:每列一個值,可以與另一個運算式組合或用於另一個運算式,或直接新增至 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 是常數字串,可以有以下三個值之一:

  • ASC:遞增排序。

  • DESC:遞減排序。

  • NONE

若您定義 sort_type ASCDESC,則您需要定義排序運算式。透過 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 欄位不是 USCanada 的任何列,並從彙總中排除這些列。篩選掉的列仍然會有輸出值,但與所有其他輸出列一樣,這只包含未透過篩選條件排除的列的彙總結果。

start_expr,end_expr

也可以選擇為滑動視窗功能設定引數。這進一步限制了要彙總在一起的列數。每個輸出列將僅包含目前列之前和之後數列的 (彙總) 結果。滑動視窗需要兩個引數 (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

例如,若要納入從目前列算起第三列和之後所有列:

Window(concat(Text(Salary),'-'), Department, 'NONE', 1, 3, UNBOUNDED()) as WSlidingSalaryDepartment

在上面的範例中,提供了排序類型 NONE,以便指令碼可以區分分割區引數和排序類型之後的參數。

範例 - 新增包含彙總的欄位

範例 - 新增包含為特定值篩選之彙總的欄位

範例 - 新增具有滑動視窗的欄位

範例 - 新增具有排序滑動視窗的欄位

限制

Window 具有下列限制:

  • Window 是資源密集函數,尤其是在記憶體取用方面。

  • Qlik Sense Mobile 中不支援 Window

  • 圖表運算式不支援 Window

  • 您無法在 Window 函數內部內嵌 Window 函數。

  • Window 無法在彙總函數內部使用。

  • Window 不能在有 group by 子句的 LOAD 陳述式中使用。

  • Window 需要能夠掃描整個表格。

  • WRank()RecNo()RowNo() 無法在使用滑動視窗功能時用於 Window

  • 使用滑動視窗功能時,計算時間會隨著視窗大小的增加而增加。通常應避免結合使用大型表格與大型視窗。

此頁面是否對您有幫助?

若您發現此頁面或其內容有任何問題——錯字、遺漏步驟或技術錯誤——請告知我們!