# 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 к текущей строке. Например, можно включить в окно три предыдущие строки и три последующие строки.

Window(avg(Salary), Department, 'NONE' -3, 3) as AvgDepSalary

Синтаксис:

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>Например, если требуется включить три предшествующие строки, текущую строку и следующую за ней строку:<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 | Оранжевый | 266.775 |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Синий | 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 | Синий | 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 | Синий | 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 | Синий | 103.43 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Черный | 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 | Оранжевый | - |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Синий | 42.94 |
| 3753 | 20180922 | 125.00 | 7 | 3036491 | L | Черный | - |
| 3754 | 20180922 | 484.21 | 13 | 049681 | XS | Красный | - |
| 3756 | 20180922 | 59.18 | 2 | 2038593 | M | Синий | 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 | Синий | 42.94 |
| 3761 | 20180926 | 3.42 | 7 | 3036491 | XS | Черный | - |
| 3763 | 20180926 | 63.55 | 12 | 049681 | S | Красный | - |
| 3763 | 20180927 | 177.56 | 10 | 2038593 | L | Синий | 118.4 |
| 3764 | 20180927 | 325.95 | 8 | 203521 | XL | Черный | - |

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

[](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 | Оранжевый | 366.865 |
| 3752 | 20180916 | 5.75 | 1 | 5646471 | S | Синий | 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 | Синий | 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 | Синий | 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 | Синий | 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 при использовании функции скользящего окна.