# 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);FROM [lib://AttachedFiles/transactions.qvd] (qvd);
```

Window поддерживает общие функции, такие как округление или базовые операции с числами. Например:

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

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

Можно определить скользящее окно для функции Window. При этом задается количество строк, используемых при применении функции Window к текущей строке. Например, можно настроить окно, которое будет включать 3 предыдущие и 3 последующие строки.

Синтаксис:

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

Тип возвращаемых данных: новое поле, добавленное в результирующую таблицу, созданную оператором LOAD.

Аргументы:

Аргументы

| Аргумент | Описание |
| --- | --- |
| input\_expr | Входное выражение, вычисленное и возвращенное функцией. Это должно быть любое выражение на основе агрегирования, такое как Median(Salary). Например:<br><br>Window(Median(Salary)) as MedianSalary<br><br>В качестве входных данных может также использоваться имя поля без применения агрегирования. В данном случае Window обрабатывает его, как если бы функция Only() была применена к этому полю. Например:<br><br>Window(Salary,Department) as WSalary<br><br>При необходимости можно определить разбивку на разделы без входного выражения. Разбивка на разделы совпадает с группировкой, которая достигается с помощью предложения group by с той разницей, что результат добавляется как новый столбец во входную таблицу. Разбивка на разделы не сокращает количество записей во входной таблице. Можно определять поля с несколькими разделами.<br><br>Пример:<br><br><br>LOAD<br>Window(Max(Sales), City, 'ASC', OrderDate, Sales &gt; 300)<br>+ AddMonths(OrderDate,-6) as MAX\_Sales\_City\_Last\_6\_Mos,<br>Window(Avg(Sales), City, 'ASC', OrderDate, City = 'Portland')<br>+ AddMonths(OrderDate,-6) as Avg\_Sales\_Portland\_Last\_6\_Mos,<br>Window(Max(Sales), City, 'ASC', OrderDate, Sales &gt; 300)<br>+ AddMonths(OrderDate,-12) as MAX\_Sales\_City\_Last\_12\_Mos;<br>LOAD<br>City,<br>Sales,<br>OrderDate<br>FROM [lib://:DataFiles/Sales Data.xlsx]FROM [lib://AttachedFiles/Sales Data.xlsx]<br>(ooxml, embedded labels, table is [Sales Data]); |
| partition1, partition2 | После input\_expr можно определить любое количество разделов. Разделы ― это поля, которые определяют, к каким комбинациям должно применяться агрегирование. Агрегирование применяется отдельно к каждому разделу. Например:<br><br>Window(Avg(Salary), Unit, Department, Country) as AvgSalary<br><br>В приведенном выше имеются разделы: Unit, Department и Country.<br><br>Разделы не являются обязательными, но необходимы для правильного формирования окон для полей. |
| sort\_type, [sort\_expr]] | При необходимости укажите тип сортировки и выражение сортировки. sort\_type может иметь одно из двух значений:<br><br><ul> <li> <p> <span>ASC</span>:&nbsp;сортировка по возрастанию.</p> </li> <li> <p> <span>DESC</span>:&nbsp;сортировка по убыванию.</p> </li> </ul><br><br>Если определен тип сортировки (sort\_type), необходимо определить выражение сортировки. Это выражение, которое определяет порядок строк в разделе.<br><br>Например:<br><br>Window(RecNo(), Department, 'ASC', Year)<br><br>В примере выше результаты в разделе сортируются по полю Year в порядке возрастания.<br><br>Примечание к информацииТип и выражение сортировки требуются, в основном, при использовании функций RecNo и WRank. |
| filter\_expr | При необходимости добавьте выражение фильтра. Это логическое выражение, которое определяет, следует включать запись в вычисление или нет.<br><br>Этот параметр можно полностью опустить, тогда фильтрации не будет.<br><br>Например:<br><br>Window(avg(Salary), Department, 'ASC', Age, EmployeeID=3 Or EmployeeID=7)<br>as wAvgSalary) as wAvgSalaryIfEmpIs3or7 |
| [start\_expr,end\_expr] | При необходимости задайте аргумент для обеспечения функции скользящего окна. Скользящее окно требует два аргумента:<br><br><ul> <li> <p>Начальное выражение:&nbsp;количество строк перед текущей строкой, которое необходимо включить в окно.</p> </li> <li> <p>Конечное выражение:&nbsp;количество строк после текущей строки, которое необходимо включить в окно.</p> </li> </ul><br><br>Например, если требуется включить 3 предшествующие строки, текущую строку и следующую строку:<br><br>Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year&gt;0, -3, 1)<br>as WSalaryDepartment<br><br>Чтобы указать все предшествующие строки или все последующие строки, можно использовать функцию Unbounded(). Например, если требуется включить 3 предшествующие строки, текущую строку и следующую строку:<br><br>Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year&gt;0, UNBOUNDED(), 1)<br>as WSlidingSalaryDepartment<br><br>Например, чтобы включить третью строку от текущей и все последующие строки:<br><br>Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year&gt;0, 3, UNBOUNDED())<br>as WSlidingSalaryDepartment |

## Пример ― добавление поля, содержащего агрегирование

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/WindowFunctions/window.htm)

#### Пример: добавление поля, содержащего агрегирование

Скрипт загрузки

Создайте новую вкладку в редакторе загрузки данных и загрузите следующие данные через встроенную загрузку. Создайте приведенную ниже таблицу ниже в Qlik Sense, чтобы увидеть результаты.

```
Transactions:
Load
*,
Window(Avg(transaction_amount),customer_id) as AvgCustTransaction;

Load * Inline [
transaction_id, transaction_date, transaction_amount, transaction_quantity, customer_id, size, color_code
3750, 20180830, 23.56, 2, 2038593, L, Red
3751, 20180907, 556.31, 6, 203521, M, Orange
3752, 20180916, 5.75, 1, 5646471, S, Blue
3753, 20180922, 125.00, 7, 3036491, L, Black
3754, 20180922, 484.21, 13, 049681, XS, Red
3756, 20180922, 59.18, 2, 2038593, M, Blue
3757, 20180923, 177.42, 21, 203521, XL, Black
3758, 20180924, 153.42, 14, 2038593, L, Red
3759, 20180925, 7.42, 5, 203521, M, Orange
3760, 20180925, 80.12, 18, 5646471, M, Blue
3761, 20180926, 3.42, 7, 3036491, XS, Black
3763, 20180926, 63.55, 12, 049681, S, Red
3763, 20180927, 177.56, 10, 2038593, L, Blue
3764, 20180927, 325.95, 8, 203521, XL, Black
];
 
```

Результаты

Результаты добавления поля, содержащего агрегирование

| transaction\_id | transaction\_date | transaction\_amount | transaction\_quantity | customer\_id | size | color\_code | AvgCustTransaction |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 3750 | 20180830 | 23.56 | 2 | 2038593 | L | Красный | 103.43 |
| 3751 | 20180907 | 556.31 | 6 | 203521 | M | Orange | 266.775 |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Синий | 42.935 |
| 3753 | 20180922 | 125.00 | 7 | 3036491 | L | Black | 64.21 |
| 3754 | 20180922 | 484.21 | 13 | 049681 | XS | Красный | 273.88 |
| 3756 | 20180922 | 59.18 | 2 | 2038593 | M | Синий | 103.43 |
| 3757 | 20180923 | 177.42 | 21 | 203521 | XL | Black | 266.775 |
| 3758 | 20180924 | 153.42 | 14 | 2038593 | L | Красный | 103.43 |
| 3759 | 20180925 | 7.42 | 5 | 203521 | M | Orange | 266.775 |
| 3760 | 20180925 | 80.12 | 18 | 5646471 | M | Синий | 42.935 |
| 3761 | 20180926 | 3.42 | 7 | 3036491 | XS | Black | 64.21 |
| 3763 | 20180926 | 63.55 | 12 | 049681 | S | Красный | 273.88 |
| 3763 | 20180927 | 177.56 | 10 | 2038593 | L | Синий | 103.43 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Black | 266.775 |

## Пример ― добавление поля, содержащего агрегирование, отфильтрованное для конкретных значений

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/WindowFunctions/window.htm)

#### Пример: добавление поля, содержащего агрегирование, отфильтрованное для конкретных значений

Скрипт загрузки

Создайте новую вкладку в редакторе загрузки данных и загрузите следующие данные через встроенную загрузку. Создайте приведенную ниже таблицу ниже в Qlik Sense, чтобы увидеть результаты.

```
Transactions:
Load
*,
Window(Avg(transaction_amount),customer_id, color_code = 'Blue') as AvgCustTransaction;

Load * Inline [
transaction_id, transaction_date, transaction_amount, transaction_quantity, customer_id, size, color_code
3750, 20180830, 23.56, 2, 2038593, L, Red
3751, 20180907, 556.31, 6, 203521, M, Orange
3752, 20180916, 5.75, 1, 5646471, S, Blue
3753, 20180922, 125.00, 7, 3036491, L, Black
3754, 20180922, 484.21, 13, 049681, XS, Red
3756, 20180922, 59.18, 2, 2038593, M, Blue
3757, 20180923, 177.42, 21, 203521, XL, Black
3758, 20180924, 153.42, 14, 2038593, L, Red
3759, 20180925, 7.42, 5, 203521, M, Orange
3760, 20180925, 80.12, 18, 5646471, M, Blue
3761, 20180926, 3.42, 7, 3036491, XS, Black
3763, 20180926, 63.55, 12, 049681, S, Red
3763, 20180927, 177.56, 10, 2038593, L, Blue
3764, 20180927, 325.95, 8, 203521, XL, Black
];
 
```

Результаты

Результаты добавления поля, содержащего агрегирование, отфильтрованное для конкретных значений

| transaction\_id | transaction\_date | transaction\_amount | transaction\_quantity | customer\_id | size | color\_code | AvgCustTransaction |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 3750 | 20180830 | 23.56 | 2 | 2038593 | L | Красный | - |
| 3751 | 20180907 | 556.31 | 6 | 203521 | M | Orange | - |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Синий | 42.94 |
| 3753 | 20180922 | 125.00 | 7 | 3036491 | L | Black | - |
| 3754 | 20180922 | 484.21 | 13 | 049681 | XS | Красный | - |
| 3756 | 20180922 | 59.18 | 2 | 2038593 | M | Синий | 118.4 |
| 3757 | 20180923 | 177.42 | 21 | 203521 | XL | Black | - |
| 3758 | 20180924 | 153.42 | 14 | 2038593 | L | Красный | - |
| 3759 | 20180925 | 7.42 | 5 | 203521 | M | Orange | - |
| 3760 | 20180925 | 80.12 | 18 | 5646471 | M | Синий | 42.94 |
| 3761 | 20180926 | 3.42 | 7 | 3036491 | XS | Black | - |
| 3763 | 20180926 | 63.55 | 12 | 049681 | S | Красный | - |
| 3763 | 20180927 | 177.56 | 10 | 2038593 | L | Синий | 118.4 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Black | - |

## Пример ― добавление поля со скользящим окном

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/WindowFunctions/window.htm)

#### Пример: добавление поля со скользящим окном

Скрипт загрузки

Создайте новую вкладку в редакторе загрузки данных и загрузите следующие данные через встроенную загрузку. Создайте приведенную ниже таблицу ниже в Qlik Sense, чтобы увидеть результаты.

```
Transactions:
Load
*,
Window(Avg(transaction_amount),customer_id, 'ASC', -1, 1, 0, 1) as AvgCustTransaction;

Load * Inline [
transaction_id, transaction_date, transaction_amount, transaction_quantity, customer_id, size, color_code
3750, 20180830, 23.56, 2, 2038593, L, Red
3751, 20180907, 556.31, 6, 203521, M, Orange
3752, 20180916, 5.75, 1, 5646471, S, Blue
3753, 20180922, 125.00, 7, 3036491, L, Black
3754, 20180922, 484.21, 13, 049681, XS, Red
3756, 20180922, 59.18, 2, 2038593, M, Blue
3757, 20180923, 177.42, 21, 203521, XL, Black
3758, 20180924, 153.42, 14, 2038593, L, Red
3759, 20180925, 7.42, 5, 203521, M, Orange
3760, 20180925, 80.12, 18, 5646471, M, Blue
3761, 20180926, 3.42, 7, 3036491, XS, Black
3763, 20180926, 63.55, 12, 049681, S, Red
3763, 20180927, 177.56, 10, 2038593, L, Blue
3764, 20180927, 325.95, 8, 203521, XL, Black
];
 
```

Результаты

Результаты добавления поля, содержащего агрегирование, отфильтрованное для конкретных значений

| transaction\_id | transaction\_date | transaction\_amount | transaction\_quantity | customer\_id | size | color\_code | AvgCustTransaction |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 3750 | 20180830 | 23.56 | 2 | 2038593 | L | Красный | 41.37 |
| 3751 | 20180907 | 556.31 | 6 | 203521 | M | Orange | 366.865 |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Синий | 42.935 |
| 3753 | 20180922 | 125.00 | 7 | 3036491 | L | Black | 64.21 |
| 3754 | 20180922 | 484.21 | 13 | 049681 | XS | Красный | 273.88 |
| 3756 | 20180922 | 59.18 | 2 | 2038593 | M | Синий | 106.3 |
| 3757 | 20180923 | 177.42 | 21 | 203521 | XL | Black | 92.42 |
| 3758 | 20180924 | 153.42 | 14 | 2038593 | L | Красный | 165.49 |
| 3759 | 20180925 | 7.42 | 5 | 203521 | M | Orange | 166.685 |
| 3760 | 20180925 | 80.12 | 18 | 5646471 | M | Синий | 80.12 |
| 3761 | 20180926 | 3.42 | 7 | 3036491 | XS | Black | 3.42 |
| 3763 | 20180926 | 63.55 | 12 | 049681 | S | Красный | 177.56 |
| 3763 | 20180927 | 177.56 | 10 | 2038593 | L | Синий | 63.55 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Black | 325.95 |

## Ограничения

Window имеет следующие ограничения:

* Функция Window потребляет много ресурсов, особенно памяти.

* Выражения диаграммы не поддерживают Window.

* Нельзя вкладывать функции Window в другие функции Window.

* Window нельзя использовать внутри функции агрегирования.

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

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