.. _aggregate_functions_parametric: Параметрические агрегатные функции ================================== Некоторые агрегатные функции могут принимать не только столбцы-аргументы (по которым производится свёртка), но и набор параметров - констант для инициализации. Синтаксис - две пары круглых скобок вместо одной. Первая - для параметров, вторая - для аргументов. sequenceMatch(pattern)(time, cond1, cond2, ...) ----------------------------------------------- Сопоставление с образцом для цепочки событий. ``pattern`` - строка, содержащая шаблон для сопоставления. Шаблон похож на регулярное выражение. ``time`` - время события, тип DateTime ``cond1``, ``cond2`` ... - от одного до 32 аргументов типа UInt8 - признаков, было ли выполнено некоторое условие для события. Функция собирает в оперативке последовательность событий. Затем производит проверку на соответствие этой последовательности шаблону. Возвращает UInt8 - 0, если шаблон не подходит и 1, если шаблон подходит. Пример: ``sequenceMatch('(?1).*(?2)')(EventTime, URL LIKE '%company%', URL LIKE '%cart%')`` - была ли цепочка событий, в которой посещение страницы с адресом, содержащим company было раньше по времени посещения страницы с адресом, содержащим cart. Это вырожденный пример. Его можно записать с помощью других агрегатных функций: .. code-block:: text minIf(EventTime, URL LIKE '%company%') < maxIf(EventTime, URL LIKE '%cart%'). Но в более сложных случаях, такого решения нет. Синтаксис шаблонов: ``(?1)`` - ссылка на условие (вместо 1 - любой номер); ``.*`` - произвольное количество любых событий; ``(?t>=1800)`` - условие на время; за указанное время допускается любое количество любых событий; вместо >= могут использоваться операторы <, >, <=; вместо 1800 может быть любое число; События, произошедшие в одну секунду, могут оказаться в цепочке в произвольном порядке. От этого может зависеть результат работы функции. sequenceCount(pattern)(time, cond1, cond2, ...) ----------------------------------------------- Аналогично функции sequenceMatch, но возвращает не факт наличия цепочки событий, а UInt64 - количество найденных цепочек. Цепочки ищутся без перекрытия. То есть, следующая цепочка может начаться только после окончания предыдущей. uniqUpTo(N)(x) -------------- Вычисляет количество различных значений аргумента, если оно меньше или равно N. В случае, если количество различных значений аргумента больше N, возвращает N + 1. Рекомендуется использовать для маленьких N - до 10. Максимальное значение N - 100. Для состояния агрегатной функции используется количество оперативки равное 1 + N * размер одного значения байт. Для строк запоминается некриптографический хэш, имеющий размер 8 байт. То есть, для строк вычисление приближённое. Функция также работает для нескольких аргументов. Работает максимально быстро за исключением патологических случаев, когда используется большое значение N и количество уникальных значений чуть меньше N. Пример применения: .. code-block:: text Задача: показывать в отчёте только поисковые фразы, по которым было хотя бы 5 уникальных посетителей. Решение: пишем в запросе GROUP BY SearchPhrase HAVING uniqUpTo(4)(UserID) >= 5