Window - 指令碼函數
Window() 從多個列執行計算,分別為每一列產生值。
您可以使用 Window 函數執行操作,例如:
-
比較列中的個別數值與欄內的平均值、最大值或最小值。
-
計算個別值的排名,可以是欄內或整個表格內。
Window 函數不會變更表格中的記錄數量,但仍可作為彙總、關係和範圍函數執行類似任務。
Window 函數必須有您所用表格的 LOAD 陳述式內的快取,以新增至表格。例如︰
視窗支援一般函數,例如捨入或基本數值操作。例如︰
您可以定義 Window 函數的滑動視窗。這設定在目前列套用 Window 函數時使用的列數。例如,您可以將視窗設定為之前 3 列和之後 3 列。
語法:
傳回資料類型:新增至 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
如上述,分割為 Unit、Department 和 Country。 分割不是強制性質,但需要分割才能正常建立欄位視窗。 |
sort_type, [sort_expr]] |
也可以選擇指定排序類型和排序運算式。sort_type 可以有兩個值之一:
若您定義 sort_type,您需要定義排序運算式。此為決定分割內列順序的運算式。 例如︰ Window(RecNo(), Department, 'ASC', Year)
在以上範例中,呈現分割內透過 Year 欄位遞增排序的結果。 資訊備註排序類型和排序運算式主要僅在搭配 RecNo 和 WRank 時需要。
|
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) 若要指示所有之前的列或所有之後的列,您可以使用 Unbounded() 函數。例如,若要納入所有之前的列、目前的列以及下一列: Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, UNBOUNDED(), 1) 例如,若要納入從目前的列算起第三列和所有之後的列: Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, 3, UNBOUNDED()) |
範例 - 新增包含彙總的欄位
範例 - 新增包含為特定值篩選之彙總的欄位
範例 - 新增具有滑動視窗的欄位
限制
Window 有下列限制:
-
Window 是資源密集函數,尤其是就記憶體消耗而言。
-
圖表運算式不支援 Window。
-
您無法在其他 Window 函數內部內嵌 Window 函數。
-
無法在彙總函數內部使用 Window。
-
Window 需要能夠掃描整個表格。
-
使用滑動視窗功能時,WRank()、RecNo() 和 RowNo() 無法搭配 Window 使用。