Перейти к основному содержимому Перейти к дополнительному содержимому

Функция скрипта — 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 (input_expr, [partition1, partition2, ...], [sort_type, [sort_expr]],[filter_expr], [start_expr,end_expr])

Возвращаемые типы данных: Новое поле, добавленное в таблицу, созданную при помощи оператора 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 может иметь одно из двух значений:

  • ASC: Сортировка по возрастанию.

  • DESC: Сортировка по убыванию.

Если определено значение 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)
as WSalaryDepartment

Чтобы указать все предыдущие или все последующие строки, можно использовать функцию Unbounded(). Например, если требуется включить все предшествующие строки, текущую строку и следующую за ней строку:

Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, UNBOUNDED(), 1)
as WSlidingSalaryDepartment

Например, чтобы включить третью строку от текущей и все последующие строки:

Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, 3, UNBOUNDED())
as WSlidingSalaryDepartment

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

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

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

Ограничения

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

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

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

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

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

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

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

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

Помогла ли вам эта страница?

Если вы обнаружили какую-либо проблему на этой странице и с ее содержанием — будь то опечатка, пропущенный шаг или техническая ошибка, сообщите нам об этом, чтобы мы смогли ее исправить!