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://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 在 Qlik Sense Mobile 中不受支持。
-
图表表达式不支持Window。
-
不能在其他 Window 函数中嵌套 Window 函数。
-
Window 不能在聚合函数内部使用。
-
Window 需要能够扫描整个表格。
-
WRank()、RecNo() 和 RowNo() 使用滑动窗口功能时无法与 Window 一起使用.