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

Window - 指令碼函數

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

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

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

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

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

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

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

視窗支援一般函數,例如捨入或基本數值操作。例如︰

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://:DataFiles/Sales Data.xlsx]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 是資源密集函數,尤其是就記憶體消耗而言。

  • 圖表運算式不支援 Window

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

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

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

  • 使用滑動視窗功能時,WRank()RecNo()RowNo() 無法搭配 Window 使用。

此頁面是否對您有幫助?

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

加入分析現代化計畫

Remove banner from view

透過分析現代化程式進行現代化而不犧牲寶貴的 QlikView 應用程式。 按一下這裡 取得更多資訊或聯繫: ampquestions@qlik.com