Window - 脚本函数
Window() 从完整表格的部分(或"窗口")的多行中执行计算,并为每一行生成一个值。
您可以使用 Window 函数执行以下操作:
-
将一行中的单个数值与表窗口内的平均值、最大值或最小值进行比较。
-
计算窗口中或整个表中单个值的秩。
Window 函数不会更改表中记录的数量,但它仍然可以执行与聚合、关系和范围函数类似的任务。
Window 函数必须包含在所使用表格的 LOAD 语句中,或者引用该表格,例如使用驻留 LOAD。例如,请参阅示例 - 添加包含聚合的字段 。
可以省略名称,但这样会导致字段名称被设置为 Window 函数表达式的全部内容。例如,下面示例中的 AvgDepSalary:
建议给 Window 函数赋予一个字段名。
Window支持一般函数,如舍入或基本的数值运算。例如:
Window 函数可扫描整个表。就内存消耗而言,这种扫描的成本与表中字段的数量成正比。相比字段较多的表,Window 函数总是更倾向于使用字段较少的表。
通常情况下,与包含相同聚合函数、Where 子句(筛选器)、Group by 子句(分区)和 Order by 子句(排序)的类似脚本操作相比,Window 函数消耗的内存是后者的 2-4 倍,重新加载时间是后者的 2-4 倍。
语法:
返回数据类型:每行一个值,可与其他表达式组合或在其他表达式中使用,也可直接添加到 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 这计算了每个国家每个部门的平均工资。不同国家的重复部门,如 Sweden 的 Marketing 和 Canada 的 Marketing,将作为不同的分区处理。 分区与 group by 子句实现的分组类似。然而,与输入表相比,分区不会减少记录的数量。 |
sort_type, [sort_expr] | 也可以指定排序类型和排序表达式。这定义了执行聚合的顺序。 sort_type 是一个常量字符串,可以有三个值之一:
如果定义了 sort_type ASC 或 DESC,则需要定义一个排序表达式。使用 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 字段不是 US 或 Canada 的任何记录,从而将这些行排除在汇总之外。被排除的行仍会有输出值,但与所有其他输出行一样,它们将只包含未被筛选器排除的行的汇总结果。 |
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 是一个资源密集型函数,特别是在内存消耗方面。
Window 在 Qlik Sense Mobile 中不受支持。
图表表达式不支持Window。
不能在其他 Window 函数中嵌套 Window 函数。
Window 不能在聚合函数内部使用。
Window 不能在带有分组方式子句的加载语句中使用。
Window 需要能够扫描整个表格。
WRank()、RecNo() 和 RowNo() 使用滑动窗口功能时无法与 Window 一起使用.
当使用滑动窗口功能时,计算时间会随着窗口的大小而增加。一般情况下,应避免使用大型表格和大型窗口。