mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-16 20:53:27 +00:00
73 lines
5.1 KiB
ReStructuredText
73 lines
5.1 KiB
ReStructuredText
|
.. _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
|