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

Window() выполняет расчеты из нескольких строк, вычисляя для каждой строки отдельное значение.

Функции Window позволяют выполнять следующие операции:

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

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

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

Чтобы добавить таблицу, функция Window должна иметь кэш в операторе LOAD такой таблицы. Пример.

```
[Transactions]:
Load 
	*,
	Window(avg(Expression1),[Num]);
LOAD
	TransLineID,
	TransID,
	"Num",
	Dim1,
	Dim2,
	Dim3,
	Expression1,
	Expression2,
	Expression3
FROM [lib://AttachedFiles/transactions.qvd] (qvd);
```

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

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

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

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

Синтаксис:

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://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>Например, если требуется включить три предшествующие строки, текущую строку и следующую за ней строку:<br><br>Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year&gt;0, -3, 1)<br>as WSalaryDepartment<br><br>Чтобы указать все предыдущие или все последующие строки, можно использовать функцию Unbounded(). Например, если требуется включить все предшествующие строки, текущую строку и следующую за ней строку:<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/sense/Subsystems/Hub/Content/Sense_Hub/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 | Оранжевый | 266.775 |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Blue | 42.935 |
| 3753 | 20180922 | 125.00 | 7 | 3036491 | L | Черный | 64.21 |
| 3754 | 20180922 | 484.21 | 13 | 049681 | XS | Красный | 273.88 |
| 3756 | 20180922 | 59.18 | 2 | 2038593 | M | Blue | 103.43 |
| 3757 | 20180923 | 177.42 | 21 | 203521 | XL | Черный | 266.775 |
| 3758 | 20180924 | 153.42 | 14 | 2038593 | L | Красный | 103.43 |
| 3759 | 20180925 | 7.42 | 5 | 203521 | M | Оранжевый | 266.775 |
| 3760 | 20180925 | 80.12 | 18 | 5646471 | M | Blue | 42.935 |
| 3761 | 20180926 | 3.42 | 7 | 3036491 | XS | Черный | 64.21 |
| 3763 | 20180926 | 63.55 | 12 | 049681 | S | Красный | 273.88 |
| 3763 | 20180927 | 177.56 | 10 | 2038593 | L | Blue | 103.43 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Черный | 266.775 |

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

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/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 | Оранжевый | - |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Blue | 42.94 |
| 3753 | 20180922 | 125.00 | 7 | 3036491 | L | Черный | - |
| 3754 | 20180922 | 484.21 | 13 | 049681 | XS | Красный | - |
| 3756 | 20180922 | 59.18 | 2 | 2038593 | M | Blue | 118.4 |
| 3757 | 20180923 | 177.42 | 21 | 203521 | XL | Черный | - |
| 3758 | 20180924 | 153.42 | 14 | 2038593 | L | Красный | - |
| 3759 | 20180925 | 7.42 | 5 | 203521 | M | Оранжевый | - |
| 3760 | 20180925 | 80.12 | 18 | 5646471 | M | Blue | 42.94 |
| 3761 | 20180926 | 3.42 | 7 | 3036491 | XS | Черный | - |
| 3763 | 20180926 | 63.55 | 12 | 049681 | S | Красный | - |
| 3763 | 20180927 | 177.56 | 10 | 2038593 | L | Blue | 118.4 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Черный | - |

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

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/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 | Оранжевый | 366.865 |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Blue | 42.935 |
| 3753 | 20180922 | 125.00 | 7 | 3036491 | L | Черный | 64.21 |
| 3754 | 20180922 | 484.21 | 13 | 049681 | XS | Красный | 273.88 |
| 3756 | 20180922 | 59.18 | 2 | 2038593 | M | Blue | 106.3 |
| 3757 | 20180923 | 177.42 | 21 | 203521 | XL | Черный | 92.42 |
| 3758 | 20180924 | 153.42 | 14 | 2038593 | L | Красный | 165.49 |
| 3759 | 20180925 | 7.42 | 5 | 203521 | M | Оранжевый | 166.685 |
| 3760 | 20180925 | 80.12 | 18 | 5646471 | M | Blue | 80.12 |
| 3761 | 20180926 | 3.42 | 7 | 3036491 | XS | Черный | 3.42 |
| 3763 | 20180926 | 63.55 | 12 | 049681 | S | Красный | 177.56 |
| 3763 | 20180927 | 177.56 | 10 | 2038593 | L | Blue | 63.55 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Черный | 325.95 |

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

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

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

* Window не поддерживается в Qlik Sense Mobile.

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

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

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

* Window должно иметь возможность сканировать всю таблицу.

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