跳到主要内容 跳到补充内容

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);

窗口支持一般函数,如舍入或基本的数值运算。例如:

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] (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 是一个资源密集型函数,特别是在内存消耗方面。

  • WindowQlik Sense Mobile 中不受支持。

  • 图表表达式不支持Window

  • 不能在其他 Window 函数中嵌套 Window 函数。

  • Window 不能在聚合函数内部使用。

  • Window 需要能够扫描整个表格。

  • WRank()RecNo()RowNo() 使用滑动窗口功能时无法与 Window 一起使用.

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们如何改进!