# Window - 脚本函数

Window() 从完整表格的部分（或"窗口"）的多行中执行计算，并为每一行生成一个值。

您可以使用 Window 函数执行以下操作：

* 将一行中的单个数值与表窗口内的平均值、最大值或最小值进行比较。

* 计算窗口中或整个表中单个值的秩。

Window 函数不会更改表中记录的数量，但它仍然可以执行与聚合、关系和范围函数类似的任务。

Window 函数必须包含在所使用表格的 LOAD 语句中，或者引用该表格，例如使用驻留 LOAD。例如，请参阅[示例 - 添加包含聚合的字段](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/WindowFunctions/Window.htm#Example2) 。

可以省略名称，但这样会导致字段名称被设置为 Window 函数表达式的全部内容。例如，下面示例中的 AvgDepSalary：

```
[AvgSalary]:
Load 
	*,
	Window(avg(Salary), Department) as AvgDepSalary
Resident Employees;
```

信息注释

建议给 Window 函数赋予一个字段名。

Window支持一般函数，如舍入或基本的数值运算。例如：

```
Load *, Round(Window(Sum(Salary),Department)) as SumDepSalary
```

```
Load *, Window(Sum(Salary),Department) + 5 as SumDepSalary
```

信息注释

Window 函数可扫描整个表。就内存消耗而言，这种扫描的成本与表中字段的数量成正比。相比字段较多的表，Window 函数总是更倾向于使用字段较少的表。

通常情况下，与包含相同聚合函数、Where 子句（筛选器）、Group by 子句（分区）和 Order by 子句（排序）的类似脚本操作相比，Window 函数消耗的内存是后者的 2-4 倍，重新加载时间是后者的 2-4 倍。

语法：

Window (Window (main\_expr, [partition1, partition2, ...], [sort\_type, [sort\_expr],[filter\_expr], [start\_expr, end\_expr]]))

返回数据类型：每行一个值，可与其他表达式组合或在其他表达式中使用，也可直接添加到 LOAD 语句创建的结果表格中。

参数：

参数

| 参数 | 描述 |
| --- | --- |
| main\_expr | 函数计算和返回的主输入表达式。它必须是基于聚合的任何表达式，例如Median(Salary)。例如：<br><br>Window(Median(Salary)) as MedianSalary<br><br>表达式也可以是不应用聚合的字段名。在这种情况下，Window将其视为 Only() 函数应用于该字段。例如：<br><br>Window(Salary) as WSalary<br><br>不允许使用包含嵌套聚合函数或嵌套窗口函数（如 Window(Sum(Avg(Salary))) 或 Window(Sum(Window(Salary))) ）的表达式。 |
| partition1, partition2 | main\_expr之后，您可以定义任意数量的分区。分区是定义应用聚合的组合的字段。例如：<br><br>Window(Avg(Salary), Department) as AvgDepSalary<br><br>这计算了每个部门的平均工资。<br><br>当提供多个分区参数时，聚合将应用于具有唯一分区字段组合的每一行。例如：<br><br>Window(Avg(Salary), Department, Country) as AvgDepSalaryPerCountry<br><br>这计算了每个国家每个部门的平均工资。不同国家的重复部门，如 Sweden 的 Marketing 和 Canada 的 Marketing，将作为不同的分区处理。<br><br>分区与 group by 子句实现的分组类似。然而，与输入表相比，分区不会减少记录的数量。 |
| sort\_type, [sort\_expr] | 也可以指定排序类型和排序表达式。这定义了执行聚合的顺序。 sort\_type 是一个常量字符串，可以有三个值之一：<br><br><ul><li><p><span>ASC</span>：升序排序。</p></li><li><p><span>DESC</span>：降序排序。</p></li><li><p>NONE</p></li></ul><br><br>如果定义了 sort\_type ASC 或 DESC，则需要定义一个排序表达式。使用 sort\_type NONE 时，不应提供排序表达式。排序表达式决定了分区中行的顺序。<br><br>例如：<br><br>Window(RecNo(), Department, 'ASC', Year)<br><br>在上面的示例中，分区内的聚合由 Year 字段递增执行。<br><br>排序参数也会影响滑动窗口处理表的顺序。相关示例请参阅[示例 - 添加带有已排序滑动窗口的字段](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/WindowFunctions/Window.htm#Example3)。 |
| filter\_expr | 也可以添加筛选器表达式。这是一个布尔表达式，用于决定记录是否应包含在计算中。<br><br>如果提供 filter\_expr，则应包括排序类型。如果没有定义排序类型，则参数可能被解释为分区参数，而不是筛选表达式。filter\_expr 参数可以完全省略，也可以包含一个真实值。这两种方法都不会使用筛选器，因而不会排除任何记录。<br><br>例如：<br><br>Window(avg(Salary), Department, 'ASC', Age, Country='US' Or Country='Canada') as AvgDepSalaryInUsOrCanada<br><br>上述 Window 语句将过滤掉 Country 字段不是 US 或 Canada 的任何记录，从而将这些行排除在汇总之外。被排除的行仍会有输出值，但与所有其他输出行一样，它们将只包含未被筛选器排除的行的汇总结果。 |
| start\_expr,end\_expr | 也可以设置滑动窗口功能的参数。这进一步限制了要聚合在一起的行数。每个输出行将只包括当前行之前和之后的多行的（聚合）结果。滑动窗口需要两个参数 (start\_expr,end\_expr)：如果提供了这些参数，则不应跳过排序类型。否则，参数可能被解释为分区参数，而不是滑动窗口。参数 start\_expr,end\_expr 包括：<br><br><ul><li><p>开始表达式：要包含在窗口中的当前行之前的行数。</p></li><li><p>结束表达式：要包含在窗口中的当前行之后的行数。</p></li></ul><br><br>例如，如果要包括前面的 3 行、当前行和后续的下一行：<br><br>Window(concat(Text(Salary),'-'), Department, 'NONE', 1, -3, 1) as WSlidingSalaryDepartment<br><br>要指示所有前面的行或所有之前的行，可以使用 Unbounded() 函数。例如，包括所有前面的行、当前行和下面的行：<br><br>Window(concat(Text(Salary),'-'), Department, 'NONE', 1, UNBOUNDED(), 1) as WSlidingSalaryDepartment<br><br>例如，要包括当前行的第三行和所有后续行：<br><br>Window(concat(Text(Salary),'-'), Department, 'NONE', 1, 3, UNBOUNDED()) as WSlidingSalaryDepartment<br><br>在上面的示例中，提供了排序类型 NONE ，以便脚本区分分区参数和排序类型后面的参数。 |

## 示例 - 添加包含聚合的字段

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/WindowFunctions/Window.htm)

#### 示例：添加包含聚合的字段

加载脚本

在数据加载编辑器中创建一个新选项卡，然后将以下数据作为内联加载加载。在 Qlik Sense 中创建下面的表格以查看结果。

```
[Employees]:
Load 
	*,
	Window(avg(Salary), Department) as AvgDepSalary
Inline [
	Name, Department, Salary, Age, Year, Country
	David, Sales, 11, 32, 2019, Canada
	Sara, Sales, 22, 25, 2022, Sweden
	Nils, Marketing, 33, 18, 2022, Sweden
	Patrick, Marketing, 44, 43, 2022, Canada
	Anna, Sales, 55, 33, 2023, Canada
	Johan, Sales, 66, 26, 2025, Sweden
	Olle, Marketing, 77, 19, 2023, Sweden
	Bonnie, Marketing, 88, 44, 2023, US
]; 
```

结果

添加包含聚合的字段的结果

| Name | Department | Salary | Age | Year | Country | AvgDepSalary |
| --- | --- | --- | --- | --- | --- | --- |
| David | Sales | 11 | 32 | 2019 | Canada | 39 |
| Sara | Sales | 22 | 25 | 2022 | Sweden | 39 |
| Nils | Marketing | 33 | 18 | 2022 | Sweden | 61 |
| Patrick | Marketing | 44 | 43 | 2022 | Canada | 61 |
| Anna | Sales | 55 | 33 | 2023 | Canada | 39 |
| Johan | Sales | 66 | 26 | 2025 | Sweden | 39 |
| Olle | Marketing | 77 | 19 | 2023 | Sweden | 61 |
| Bonnie | Marketing | 88 | 44 | 2023 | US | 61 |

## 示例 - 添加包含为特定值筛选的聚合的字段

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/WindowFunctions/Window.htm)

#### 示例：添加包含为特定值筛选的聚合的字段

加载脚本

在数据加载编辑器中创建一个新选项卡，然后将以下数据作为内联加载加载。在 Qlik Sense 中创建下面的表格以查看结果。

```
[Employees]:
Load 
*,
Window(avg(Salary), Department, 'NONE', Country = 'Sweden') as AvgDepSalarySweden
Inline [
	Name, Department, Salary, Age, Year, Country
	David, Sales, 11, 32, 2019, Canada
	Sara, Sales, 22, 25, 2022, Sweden
	Nils, Marketing, 33, 18, 2022, Sweden
	Patrick, Marketing, 44, 43, 2022, Canada
	Anna, Sales, 55, 33, 2023, Canada
	Johan, Sales, 66, 26, 2025, Sweden
	Olle, Marketing, 77, 19, 2023, Sweden
	Bonnie, Marketing, 88, 44, 2023, US
];
```

结果

添加包含针对特定值筛选的聚合的广告字段的结果

| Name | Department | Salary | Age | Year | Country | AvgDepSalarySweden |
| --- | --- | --- | --- | --- | --- | --- |
| David | Sales | 11 | 32 | 2019 | Canada | 44 |
| Sara | Sales | 22 | 25 | 2022 | Sweden | 44 |
| Nils | Marketing | 33 | 18 | 2022 | Sweden | 55 |
| Patrick | Marketing | 44 | 43 | 2022 | Canada | 55 |
| Anna | Sales | 55 | 33 | 2023 | Canada | 44 |
| Johan | Sales | 66 | 26 | 2025 | Sweden | 44 |
| Olle | Marketing | 77 | 19 | 2023 | Sweden | 55 |
| Bonnie | Marketing | 88 | 44 | 2023 | US | 55 |

## 示例 - 添加带有滑动窗口的字段

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/WindowFunctions/Window.htm)

#### 示例：添加带有滑动窗口的字段

加载脚本

在数据加载编辑器中创建一个新选项卡，然后将以下数据作为内联加载加载。在 Qlik Sense 中创建下面的表格以查看结果。

```
[Employees]:
Load 
	*,
	Window(concat(Text(Salary),'-'), Department, 'NONE', -1, 1) as SlidingWindow
Inline [
	Name, Department, Salary, Age, Year, Country
	David, Sales, 11, 32, 2019, Canada
	Sara, Sales, 22, 25, 2022, Sweden
	Nils, Marketing, 33, 18, 2022, Sweden
	Patrick, Marketing, 44, 43, 2022, Canada
	Anna, Sales, 55, 33, 2023, Canada
	Johan, Sales, 66, 26, 2025, Sweden
	Olle, Marketing, 77, 19, 2023, Sweden
	Bonnie, Marketing, 88, 44, 2023, US
];
```

结果

添加包含针对特定值筛选的聚合的广告字段的结果

| Name | Department | Salary | Age | Year | Country | SlidingWindow |
| --- | --- | --- | --- | --- | --- | --- |
| David | Sales | 11 | 32 | 2019 | Canada | 11-22 |
| Sara | Sales | 22 | 25 | 2022 | Sweden | 11-22-55 |
| Nils | Marketing | 33 | 18 | 2022 | Sweden | 33-44 |
| Patrick | Marketing | 44 | 43 | 2022 | Canada | 33-44-77 |
| Anna | Sales | 55 | 33 | 2023 | Canada | 22-55-66 |
| Johan | Sales | 66 | 26 | 2025 | Sweden | 55-66 |
| Olle | Marketing | 77 | 19 | 2023 | Sweden | 44-77-88 |
| Bonnie | Marketing | 88 | 44 | 2023 | US | 77-88 |

## 示例 - 添加带有已排序滑动窗口的字段

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/WindowFunctions/Window.htm)

#### 示例：添加带有滑动窗口的字段

加载脚本

在数据加载编辑器中创建一个新选项卡，然后将以下数据作为内联加载加载。在 Qlik Sense 中创建下面的表格以查看结果。

```
[Employees]:
Load 
	*,
	Window(concat(Text(Salary),'-'), Department, 'ASC', Age, -1, 1) as SortedSlidingWindow
Inline [
	Name, Department, Salary, Age, Year, Country
	David, Sales, 11, 32, 2019, Canada
	Sara, Sales, 22, 25, 2022, Sweden
	Nils, Marketing, 33, 18, 2022, Sweden
	Patrick, Marketing, 44, 43, 2022, Canada
	Anna, Sales, 55, 33, 2023, Canada
	Johan, Sales, 66, 26, 2025, Sweden
	Olle, Marketing, 77, 19, 2023, Sweden
	Bonnie, Marketing, 88, 44, 2023, US
];
```

结果

添加包含针对特定值筛选的聚合的广告字段的结果

| Name | Department | Salary | Age | Year | Country | SortedSlidingWindow |
| --- | --- | --- | --- | --- | --- | --- |
| David | Sales | 11 | 32 | 2019 | Canada | 11-55-66 |
| Sara | Sales | 22 | 25 | 2022 | Sweden | 22-66 |
| Nils | Marketing | 33 | 18 | 2022 | Sweden | 33-77-88 |
| Patrick | Marketing | 44 | 43 | 2022 | Canada | 44-77 |
| Anna | Sales | 55 | 33 | 2023 | Canada | 11-55 |
| Johan | Sales | 66 | 26 | 2025 | Sweden | 11-22-66 |
| Olle | Marketing | 77 | 19 | 2023 | Sweden | 33-44-77 |
| Bonnie | Marketing | 88 | 44 | 2023 | US | 33-88 |

为了更好地理解分区和排序顺序如何影响滑动窗口中的聚合，按名称对表格进行升序排序。

添加包含针对特定值筛选的聚合的广告字段的结果

| Name | Department | Salary | Age | Year | Country | SortedSlidingWindow |
| --- | --- | --- | --- | --- | --- | --- |
| Anna | Sales | 55 | 33 | 2023 | Canada | 11-55 |
| Bonnie | Marketing | 88 | 44 | 2023 | US | 33-88 |
| David | Sales | 11 | 32 | 2019 | Canada | 11-55-66 |
| Johan | Sales | 66 | 26 | 2025 | Sweden | 11-22-66 |
| Nils | Marketing | 33 | 18 | 2022 | Sweden | 33-77-88 |
| Olle | Marketing | 77 | 19 | 2023 | Sweden | 33-44-77 |
| Patrick | Marketing | 44 | 43 | 2022 | Canada | 44-77 |
| Sara | Sales | 22 | 25 | 2022 | Sweden | 22-66 |

在 Johan 的一行中，汇总包含 David 和 Sara 的工资值。这些是 Sales 部门分区中按年龄排序的前后行。

另一个展示包含哪些行的示例是，将 Windows 表达式从 Window(concat(Text(Salary),'-'), Department, 'ASC', Age, -1, 1) 更改为 Window(concat(Text(Name),'-'), Department, 'ASC', Age, -1, 1) 并重新加载。下表中 SortedSlidingWindow 的值给出了 Sales 分区内前后行的名称。

添加包含针对特定值筛选的聚合的广告字段的结果

| Name | Department | Salary | Age | Year | Country | SortedSlidingWindow |
| --- | --- | --- | --- | --- | --- | --- |
| Anna | Sales | 55 | 33 | 2023 | Canada | Anna-David |
| Bonnie | Marketing | 88 | 44 | 2023 | US | Bonnie-Nils |
| David | Sales | 11 | 32 | 2019 | Canada | Anna-David-Johan |
| Johan | Sales | 66 | 26 | 2025 | Sweden | David-Johan-Sara |
| Nils | Marketing | 33 | 18 | 2022 | Sweden | Bonnie-Nils-Olle |
| Olle | Marketing | 77 | 19 | 2023 | Sweden | Nils-Olle-Patrick |
| Patrick | Marketing | 44 | 43 | 2022 | Canada | Olle-Patrick |
| Sara | Sales | 22 | 25 | 2022 | Sweden | Johan-Sara |

## 限制

Window 存在以下限制：

* Window 是一个资源密集型函数，特别是在内存消耗方面。

* Window 在 Qlik Sense Mobile 中不受支持。

* 图表表达式不支持Window。

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

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

* Window 不能在带有分组方式子句的加载语句中使用。

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

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

* 当使用滑动窗口功能时，计算时间会随着窗口的大小而增加。一般情况下，应避免使用大型表格和大型窗口。