Функции агрегирования
Семейство функций, известных как функции агрегирования, состоит из функций, для которых несколько значений поля являются вводимым значением и которые возвращают один результат на группу. В данных функциях группирование определяется измерением диаграммы или предложением group by в операторе скрипта.
В число функций агрегирования входят функции Sum(), Count(), Min(), Max() и многие другие.
Большинство функций агрегирования можно использовать как в скрипте загрузки данных, так и в выражениях диаграмм, но синтаксис имеет различия.
Ограничения:
Параметр функции агрегирования не должен содержать другие функции агрегирования, кроме внутреннего агрегирования, содержащего классификатор TOTAL. Для получения более расширенных вложенных агрегирований необходимо использовать расширенную функцию Aggr вместе с указанным измерением.
Присваивая имя сущности, старайтесь не использовать одно и то же имя для нескольких полей, переменных или мер. Существует строгий порядок очередности при разрешении конфликтов между сущностями с идентичными именами. Этот порядок отражается во всех объектах и контекстах, в которых используются такие сущности. Этот порядок приоритета выглядит следующим образом:
-
Внутри агрегирования у поля есть приоритет над переменной. Метки мер не являются релевантными в агрегированиях и не приоритизируются.
-
Вне агрегирования у метки меры есть приоритет над переменной, у которой в свою очередь есть приоритет над полем.
-
Кроме того, вне агрегирования меру можно использовать повторно путем ссылки на его метку, если метка по сути не является вычисляемой. В такой ситуации мера теряет часть значимости, чтобы сократить риск создания самоссылки, и в данном случае имя всегда будет интерпретироваться, во-первых, как метка меры, во-вторых, как имя поля и, в-третьих, как имя переменной.
Использование функций агрегирования в скрипте загрузки данных
Функции агрегирования могут использоваться только внутри операторов LOAD и SELECT.
Использование функций агрегирования в выражениях диаграмм
Параметр функции агрегирования не должен содержать другие функции агрегирования, кроме внутреннего агрегирования, содержащего классификатор TOTAL. Для получения более расширенных вложенных агрегирований необходимо использовать расширенную функцию Aggr вместе с указанным измерением.
Функция агрегирования агрегирует набор возможных записей, определенных выборкой. Однако альтернативное множество записей может быть определено выражением множества в анализе множеств.
См.: Анализ множеств
Как вычисляются агрегирования
Агрегирование циклически проходит по записям определенной таблицы, агрегируя их. Например, Count(<Field>) будет считать количество записей в таблице, в которой находится <Field>. Если необходимо агрегировать только уникальные значения поля, необходимо использовать предложение distinct, например Count(distinct <Field>).
Если функция агрегирования содержит поля из различных таблиц, она циклически выполнится для записей векторного произведения таблиц из составляющих полей. Это снижает производительность, и поэтому таких агрегирований нужно избегать, особенно при большом объеме данных.
Агрегирование ключевых полей
Способ вычисления агрегирований определяет, что нельзя агрегировать ключевые поля, потому что не ясно, какая таблица должна использоваться для агрегирования. Например, если поле <Key> связывает две таблицы, не ясно, возвратит ли Count(<Key>) количество записей в первой или второй таблице.
Однако при использовании предложения distinct агрегирование четко определено и может быть вычислено.
Итак, если ключевое поле используется в функции агрегирования без предложения distinct, Qlik Sense вернет количество, которое может не иметь смысла. Решение — использовать предложение distinct или копию ключа — то есть копию, которая находится только в одной таблице.
Например, в следующих таблицах ProductID представляет собой ключ между таблицами.
Count(ProductID) может подсчитываться либо в таблице Products (которая содержит только по одной записи для каждого продукта — здесь ProductID является первичным ключом), либо в таблице Details (которая чаще всего содержит по несколько записей для каждого продукта). Если требуется подсчитать количество разных продуктов, следует использовать Count(distinct ProductID). Если требуется подсчитывать количество строк в конкретной таблице, не следует использовать ключ.