# Window Функция скрипта

Window() выполняет вычисления по нескольким строкам раздела («окно») в полной таблице и выдает отдельное значение для каждой строки.

Можно использовать функции Window для выполнения таких операций, как:

* Сравнение отдельного числового значения в строке со средним, максимальным или минимальным значением внутри окна таблицы.

* Расчет ранга отдельного значения в окне или во всей таблице.

Функция Window не изменяет количество записей в таблице, но все же может выполнять задачи, подобные функциям агрегирования, реляционных функций и функций над выборкой.

Функция Window должна быть включена в оператор LOAD обрабатываемой таблицы или ссылаться на таблицу, например, с помощью Resident LOAD. Например, см. [Пример. Добавление поля, содержащего агрегирование](https://help.qlik.com/ru-RU/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/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, всегда предпочтительнее таблицы с большим количеством полей.

Как правило, функция Window потребляет в 2-4 раза больше памяти и занимает в 2-4 раза больше времени на перезагрузку по сравнению с аналогичной операцией скрипта, содержащей такое же агрегирование, оператор Where, оператор Group by (разбиение) и оператор Order by (сортировка).

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>Здесь рассчитывается средняя зарплата по каждому из отделов во всех странах. Дублирующиеся отделы в разных странах, например, отдел маркетинга в Швеции и отдел маркетинга в Канаде, будут включаться в разные разбиения.<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>:&nbsp;сортировка по убыванию.</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/ru-RU/qlikview/September2026/Subsystems/Client/Content/QV_QlikView/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>Выражение начала:&nbsp;количество строк до текущей строки, которое необходимо включить в окно.</p> </li> <li> <p>Выражение конца:&nbsp;количество строк после текущей строки, которое необходимо включить в окно.</p> </li> </ul><br><br>Например, если требуется включить три предшествующие строки, текущую строку и следующую строку:<br><br>Window(concat(Text(Salary),'-'), Department, 'NONE', 1, -3, 1) as WSlidingSalaryDepartment<br><br>Чтобы указать все предшествующие строки или все последующие строки, можно использовать функцию Unbounded(). Например, если требуется включить 3 предшествующие строки, текущую строку и следующую строку:<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/qlikview/Subsystems/Client/Content/QV_QlikView/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/qlikview/Subsystems/Client/Content/QV_QlikView/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/qlikview/Subsystems/Client/Content/QV_QlikView/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/qlikview/Subsystems/Client/Content/QV_QlikView/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 нельзя использовать в операторе загрузки вместе с group by.

* Window нельзя использовать в операторе LOAD с предложением WHERE

* Чтобы обеспечить возможность сканирования всей таблицы, требуется Window.

* WRank(), RecNo() и RowNo() нельзя использовать вместе с Window при использовании функции скользящего окна.

* При использовании функции скользящего окна время вычислений увеличивается в зависимости от размера окна. Как правило, следует избегать больших таблиц с окнами большого размера.