Window — функция скрипта
Window() выполняет расчеты из нескольких строк, вычисляя для каждой строки отдельное значение.
Функции Window позволяют выполнять следующие операции:
-
Сравнение отдельного числового значения в строке со средним, максимальным или минимальным значением в столбце.
-
Расчет ранга отдельного значения в столбце или во всей таблице.
Функция Window не изменяет количество записей в таблице, но все же может выполнять задачи, подобные функциям агрегирования, реляционных операций и ранжирования.
Чтобы добавить таблицу, функция Window должна иметь кэш в операторе LOAD такой таблицы. Пример.
Окно поддерживает общие функции, такие как округление или базовые операции с числами. Пример.
Можно определить скользящее окно для функции Window. Таким образом задается количество строк, используемое при применении функции Window к текущей строке. Например, можно включить в окно три предыдущие строки и три последующие строки.
Синтаксис:
Тип возвращаемых данных: новое поле, добавленное в таблицу, созданную при помощи оператора LOAD.
Аргументы:
Аргумент | Описание |
---|---|
input_expr |
Входное выражение, вычисленное и возвращенное функцией. Это должно быть любое выражение на основе агрегирования, например Median(Salary). Пример. Window(Median(Salary)) as MedianSalary
В качестве входных данных может быть указано имя поля, к которому не применено агрегирование. В этом случае Window обрабатывает его, как если бы к нему была применена функция Only(). Пример. Window(Salary,Department) as WSalary
При желании можно определить разбиение на разделы с помощью входного выражения. Разбиение — это то же самое, что группировка с помощью предложения group by, с тем отличием, что результат добавляется во входную таблицу в качестве нового столбца. Разбиение не уменьшает количество записей во входной таблице. Можно определить несколько полей разделов. Пример:
LOAD
Window(Max(Sales), City, 'ASC', OrderDate, Sales > 300)
+ AddMonths(OrderDate,-6) as MAX_Sales_City_Last_6_Mos, Window(Avg(Sales), City, 'ASC', OrderDate, City = 'Portland') + AddMonths(OrderDate,-6) as Avg_Sales_Portland_Last_6_Mos, Window(Max(Sales), City, 'ASC', OrderDate, Sales > 300) + AddMonths(OrderDate,-12) as MAX_Sales_City_Last_12_Mos; LOAD City, Sales, OrderDate FROM [lib://AttachedFiles/Sales Data.xlsx] (ooxml, embedded labels, table is [Sales Data]);
|
partition1, partition2 |
После input_expr можно определить любое количество разделов. Разделы — это поля, которые определяют, какие с какими комбинациями должны применяться агрегирования. Агрегирование применяется отдельно к каждому разделу. Пример. Window(Avg(Salary), Unit, Department, Country) as AvgSalary
В приведенном выше примере есть разделы Unit, Department и Country. Разделы не являются обязательными, но они нужны для правильного определения окон полей. |
sort_type, [sort_expr]] |
При желании задайте тип сортировки и выражение сортировки. sort_type может иметь одно из двух значений:
Если определено значение sort_type, также необходимо определить выражение сортировки. Это выражение, которое определяет порядок строк в разделе. Пример. Window(RecNo(), Department, 'ASC', Year)
В приведенном выше примере, результаты в разделе сортируются по возрастанию значения в поле Year. Примечание к информацииТип сортировки и выражение сортировки, главным образом, требуются для функций RecNo и WRank.
|
filter_expr |
При желании можно добавить выражение фильтра. Это логическое выражение, которое определяет, следует включать запись в расчет или нет. Этот параметр можно полностью опустить, тогда фильтрация применяться не будет. Пример. Window(avg(Salary), Department, 'ASC', Age, EmployeeID=3 Or EmployeeID=7)
as wAvgSalary) as wAvgSalaryIfEmpIs3or7 |
[start_expr,end_expr] |
При желании можно задать аргумент для функции скользящего окна. Скользящее окно требует два аргумента:
Например, если требуется включить три предшествующие строки, текущую строку и следующую за ней строку: Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, -3, 1) Чтобы указать все предыдущие или все последующие строки, можно использовать функцию Unbounded(). Например, если требуется включить все предшествующие строки, текущую строку и следующую за ней строку: Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, UNBOUNDED(), 1) Например, чтобы включить третью строку от текущей и все последующие строки: Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, 3, UNBOUNDED()) |
Пример. Добавление поля, содержащего агрегирование
Пример. Добавление поля, содержащего агрегирование с фильтрацией по конкретным значениям
Пример. Добавление поля со скользящим окном
Ограничения
Window имеет следующие ограничения:
-
Функция Window интенсивно потребляет ресурсы, особенно память.
-
Window не поддерживается в Qlik Sense Mobile.
-
Выражения диаграммы не поддерживают Window.
-
Нельзя вкладывать функции Window в другие функции Window.
-
Window нельзя использовать внутри функции агрегирования.
-
Window должно иметь возможность сканировать всю таблицу.
-
WRank(), RecNo() и RowNo() нельзя использовать вместе с Window при использовании функции скользящего окна.