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

Window - 指令碼函數

Window() 從多列執行計算,為每列分別產生值。

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

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

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

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

Window 函數在您所用表格的 LOAD 陳述式內必須有快取,以新增至表格。例如︰

[Transactions]: Load *, Window(avg(Expression1),[Num]); LOAD TransLineID, TransID, "Num", Dim1, Dim2, Dim3, Expression1, Expression2, Expression3 FROM [lib://AttachedFiles/transactions.qvd] (qvd);

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

Load *, Round(Window(Sum(Salary),Department)) as SumSalary
Load *, Window(Sum(Salary),Department) + 5 as SumSalary

您可以定義 Window 函數的滑動視窗。這設定在目前的列套用 Window 函數時使用的列數。例如,您可以將視窗設定為之前 3 列和之後 3 列。

語法:  

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

傳回的資料類型:新欄位新增至透過 LOAD 陳述式建立的結果表格。

引數:  

引數
引數 描述
input_expr

透過函數計算並傳回輸入運算式。這必須是根據彙總的任何運算式,例如 Median(Salary)。例如︰

Window(Median(Salary)) as MedianSalary

輸入也可以是沒有套用彙總的欄位名稱。在此情況下,Window 對此的看待方式如同 Only() 函數套用至該欄位。例如︰

Window(Salary,Department) as WSalary

 

您也可以選擇定義透過輸入運算式分割。分割與透過 group by 子句達到的分組相同,差異為結果作為新欄新增至輸入表格。分割不會減少輸入表格的記錄數量。可以定義多個分割區欄位。

範例: 

LOAD Window(Max(Sales), City, 'ASC', OrderDate, Sales > 300)
+ AddMonths(OrderDate,-6) as MAX_Sales_City_Last_6_Mos, Window(Avg(Sales), City, 'ASC', OrderDate, City = 'Portland')
+ AddMonths(OrderDate,-6) as Avg_Sales_Portland_Last_6_Mos, Window(Max(Sales), City, 'ASC', OrderDate, Sales > 300)
+ AddMonths(OrderDate,-12) as MAX_Sales_City_Last_12_Mos; LOAD City, Sales, OrderDate FROM [lib://AttachedFiles/Sales Data.xlsx] (ooxml, embedded labels, table is [Sales Data]);

partition1, partition2

input_expr 之後,您可以定任何分割區數量。分割區是定義哪些組合要用來套用彙總的欄位。每個分割區會獨立套件彙總。例如︰

Window(Avg(Salary), Unit, Department, Country) as AvgSalary

總之,分割區為 UnitDepartmentCountry

分割區不是強制性質,但為適當的欄位視窗化所必需。

sort_type, [sort_expr]]

也可以選擇指定排序類型和排序運算式。sort_type 可以有兩個值之一:

  • ASC: 遞增排序。

  • DESC: 遞減排序。

若您定義 sort_type,您需要定義排序運算式。此為決定分割區內列順序的運算式。

例如︰

Window(RecNo(), Department, 'ASC', Year)

在以上範例中,分割區內的結果透過 Year 欄位遞增排序。

資訊備註主要是 RecNoWRank 函數才需要排序類型和排序運算式。
filter_expr

也可以新增篩選運算式。此為布林值運算式,這決定是否應將記錄納入計算中。

此參數可以完全省略,結果應為沒有篩選。

例如︰

Window(avg(Salary), Department, 'ASC', Age, EmployeeID=3 Or EmployeeID=7)
as wAvgSalary) as wAvgSalaryIfEmpIs3or7
[start_expr,end_expr]

也可以選擇為滑動視窗功能設定引數。 滑動視窗需要兩個引數:

  • 開始運算式: 要在視窗中納入的目前列之前的列數。

  • 結束運算式: 要在視窗中納入的目前列之後的列數。

例如,若您想要納入之前 3 列、目前列和下一列:

Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, -3, 1)
as WSalaryDepartment

若要指示之前所有列或之後所有列,您可以使用 Unbounded() 函數。例如,若要納入之前所有列、目前列和下一列:

Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, UNBOUNDED(), 1)
as WSlidingSalaryDepartment

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

Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, 3, UNBOUNDED())
as WSlidingSalaryDepartment

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

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

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

限制

Window 具有下列限制:

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

  • Qlik Sense Mobile 中不支援 Window

  • 圖表運算式不支援 Window

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

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

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

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

此頁面是否對您有幫助?

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