Параметрические агрегатные функции
Некоторые агрегатные функции могут принимать не только аргументные колонки (используемые для сжатия), но и набор параметров – константы для инициализации. Синтаксис включает две пары скобок вместо одной. Первая пара предназначена для параметров, а вторая – для аргументов.
histogram
Вычисляет адаптивный гистограмму. Она не гарантирует точные результаты.
Функция использует Адаптивный алгоритм потокового параллельного дерева решений. Границы корзин гистограммы корректируются по мере поступления новых данных в функцию. В общем случае ширины корзин не равны.
Аргументы
values
— Выражение, приводящее к входным значениям.
Параметры
number_of_bins
— Верхний предел для количества корзин в гистограмме. Функция автоматически вычисляет количество корзин. Она пытается достичь указанного числа корзин, но если это не удается, использует меньшее количество корзин.
Возвращаемые значения
lower
— Нижняя граница корзины.upper
— Верхняя граница корзины.height
— Вычисленная высота корзины.
Пример
Вы можете визуализировать гистограмму с помощью функции bar, например:
В этом случае вы должны помнить, что не знаете границы корзин гистограммы.
sequenceMatch
Проверяет, содержит ли последовательность цепочку событий, которая соответствует шаблону.
Синтаксис
События, происходящие в одну и ту же секунду, могут находиться в последовательности в неопределенном порядке, что влияет на результат.
Аргументы
-
timestamp
— Колонка, считающаяся содержащей временные данные. Типичные типы данных:Date
иDateTime
. Вы также можете использовать любой из поддерживаемых типов UInt. -
cond1
,cond2
— Условия, описывающие цепочку событий. Тип данных:UInt8
. Вы можете передать до 32 аргументов условий. Функция принимает во внимание только события, описанные в этих условиях. Если последовательность содержит данные, которые не описаны в условии, функция пропускает их.
Параметры
pattern
— Строка шаблона. См. Синтаксис шаблона.
Возвращаемые значения
- 1, если шаблон совпал.
- 0, если шаблон не совпал.
Тип: UInt8
.
Синтаксис шаблона
-
(?N)
— Соответствует аргументу условия на позицииN
. Условия нумеруются в диапазоне[1, 32]
. Например,(?1)
соответствует аргументу, переданному в параметрcond1
. -
.*
— Соответствует любому количеству событий. Вам не нужны аргументы условий для соответствия этому элементу шаблона. -
(?t operator value)
— Устанавливает время в секундах, которое должно разделять два события. Например, шаблон(?1)(?t>1800)(?2)
соответствует событиям, которые происходят более чем через 1800 секунд друг от друга. Произвольное количество любых событий может находиться между этими событиями. Вы можете использовать операторы>=
,>
,<
,<=
,==
.
Примеры
Рассмотрим данные в таблице t
:
Выполните запрос:
Функция нашла цепочку событий, где номер 2 следует за номером 1. Она пропустила номер 3 между ними, потому что этот номер не описан как событие. Если мы хотим учитывать этот номер при поиске цепочки событий, приведенной в примере, мы должны создать для него условие.
В этом случае функция не смогла найти цепочку событий, соответствующую шаблону, потому что событие для номера 3 произошло между 1 и 2. Если в том же случае мы проверили условие для номера 4, последовательность соответствовала бы шаблону.
Смотрите также
sequenceCount
Считывает количество цепочек событий, которые соответствовали шаблону. Функция ищет цепочки событий, которые не перекрываются. Она начинает искать следующую цепочку после того, как текущая цепочка найдена.
События, происходящие в одну и ту же секунду, могут находиться в последовательности в неопределенном порядке, что влияет на результат.
Синтаксис
Аргументы
-
timestamp
— Колонка, считающаяся содержащей временные данные. Типичные типы данных:Date
иDateTime
. Вы также можете использовать любой из поддерживаемых типов UInt. -
cond1
,cond2
— Условия, описывающие цепочку событий. Тип данных:UInt8
. Вы можете передать до 32 аргументов условий. Функция принимает во внимание только события, описанные в этих условиях. Если последовательность содержит данные, которые не описаны в условии, функция пропускает их.
Параметры
pattern
— Строка шаблона. См. Синтаксис шаблона.
Возвращаемые значения
- Количество несовпадающих цепочек событий, которые соответствуют шаблону.
Тип: UInt64
.
Пример
Рассмотрим данные в таблице t
:
Подсчитайте, сколько раз номер 2 происходит после номера 1 с любым количеством других чисел между ними:
sequenceMatchEvents
Возвращает временные метки событий самых длинных цепочек событий, которые соответствуют шаблону.
События, происходящие в одну и ту же секунду, могут находиться в последовательности в неопределенном порядке, что влияет на результат.
Синтаксис
Аргументы
-
timestamp
— Колонка, считающаяся содержащей временные данные. Типичные типы данных:Date
иDateTime
. Вы также можете использовать любой из поддерживаемых типов UInt. -
cond1
,cond2
— Условия, описывающие цепочку событий. Тип данных:UInt8
. Вы можете передать до 32 аргументов условий. Функция принимает во внимание только события, описанные в этих условиях. Если последовательность содержит данные, которые не описаны в условии, функция пропускает их.
Параметры
pattern
— Строка шаблона. См. Синтаксис шаблона.
Возвращаемые значения
- Массив временных меток для соответствующих аргументов условий (?N) из цепочки событий. Позиция в массиве соответствует позиции аргумента условия в шаблоне.
Тип: Массив.
Пример
Рассмотрим данные в таблице t
:
Верните временные метки событий для самой длинной цепочки
Смотрите также
windowFunnel
Ищет цепочки событий в скользящем временном окне и вычисляет максимальное количество событий, которые произошли из цепочки.
Функция работает по следующему алгоритму:
-
Функция ищет данные, которые запускают первое условие в цепочке, и устанавливает счетчик событий на 1. Это момент, когда начинает действовать скользящее окно.
-
Если события из цепочки происходят последовательно в окне, счетчик увеличивается. Если последовательность событий нарушается, счетчик не увеличивается.
-
Если в данных имеется несколько цепочек событий на разных точках завершения, функция выведет только размер самой длинной цепочки.
Синтаксис
Аргументы
timestamp
— Название колонки, содержащей временную метку. Поддерживаемые типы данных: Date, DateTime и другие беззнаковые целые типы (обратите внимание, что, хотя временная метка поддерживает типUInt64
, ее значение не может превышать максимум Int64, который равен 2^63 - 1).cond
— Условия или данные, описывающие цепочку событий. UInt8.
Параметры
window
— Длина скользящего окна, это временной интервал между первым и последним условием. Единицаwindow
зависит от самогоtimestamp
и варьируется. Определяется выражениемtimestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window
.mode
— Это необязательный аргумент. Можно установить один или несколько режимов.'strict_deduplication'
— Если одно и то же условие выполняется для последовательности событий, то такое повторяющееся событие прерывает дальнейшую обработку. Примечание: это может работать непредсказуемо, если для одного и того же события выполняется несколько условий.'strict_order'
— Не допускайте вмешательства других событий. Например, в случаеA->B->D->C
, остановите поискA->B->C
наD
, и максимальный уровень событий равен 2.'strict_increase'
— Применяйте условия только к событиям со строго возрастающими временными метками.'strict_once'
— Считайте каждое событие только один раз в цепочке, даже если оно соответствует условию несколько раз.
Возвращаемое значение
Максимальное количество последовательных срабатывающих условий из цепочки в пределах скользящего временного окна. Все цепочки в выборке анализируются.
Тип: Integer
.
Пример
Определите, достаточно ли заданного периода времени для пользователя, чтобы выбрать телефон и дважды купить его в интернет-магазине.
Установите следующую цепочку событий:
- Пользователь вошел в свой аккаунт в магазине (
eventID = 1003
). - Пользователь ищет телефон (
eventID = 1007, product = 'phone'
). - Пользователь оформил заказ (
eventID = 1009
). - Пользователь оформил заказ еще раз (
eventID = 1010
).
Входная таблица:
Узнайте, как далеко пользователь user_id
смог пройти по цепочке в период с января по февраль 2019 года.
Запрос:
Результат:
retention
Функция принимает в качестве аргументов набор условий от 1 до 32 аргументов типа UInt8
, которые указывают, было ли выполнено определенное условие для события. Любое условие может быть указано в качестве аргумента (как в WHERE).
Условия, кроме первого, применяются парами: результат второго будет истинен, если первое и второе истинны, третьего — если первое и третье истинны и т.д.
Синтаксис
Аргументы
cond
— Выражение, возвращающее результатUInt8
(1 или 0).
Возвращаемое значение
Массив из 1 или 0.
- 1 — Условие было выполнено для события.
- 0 — Условие не было выполнено для события.
Тип: UInt8
.
Пример
Рассмотрим пример расчета функции retention
для определения посещаемости сайта.
1. Создайте таблицу, чтобы проиллюстрировать пример.
Входная таблица:
Запрос:
Результат:
2. Группируйте пользователей по уникальному ID uid
, используя функцию retention
.
Запрос:
Результат:
3. Подсчитайте общее количество посещений сайта в день.
Запрос:
Результат:
Где:
r1
— количество уникальных посетителей, которые посетили сайт с 2020-01-01 (условиеcond1
).r2
— количество уникальных посетителей, которые посетили сайт в течение конкретного времени между 2020-01-01 и 2020-01-02 (условияcond1
иcond2
).r3
— количество уникальных посетителей, которые посетили сайт в течение конкретного времени 2020-01-01 и 2020-01-03 (условияcond1
иcond3
).
uniqUpTo(N)(x)
Вычисляет количество различных значений аргумента до указанного предела N
. Если количество различных значений аргумента больше N
, эта функция возвращает N
+ 1, в противном случае вычисляет точное значение.
Рекомендуется использовать с небольшими N
, до 10. Максимальное значение N
равно 100.
Для состояния агрегатной функции эта функция использует объем памяти, равный 1 + N
* размер одного значения в байтах. При работе со строками эта функция хранит некриптографический хеш размером 8 байт; вычисление для строк аппроксимировано.
Например, если у вас есть таблица, которая регистрирует каждый поисковый запрос, сделанный пользователями на вашем веб-сайте. Каждая строка в таблице представляет собой отдельный поисковый запрос с колонками для идентификатора пользователя, поискового запроса и временной метки запроса. Вы можете использовать uniqUpTo
, чтобы сгенерировать отчет, показывающий только ключевые слова, которые использовались как минимум 5 уникальными пользователями.
uniqUpTo(4)(UserID)
вычисляет количество уникальных значений UserID
для каждого SearchPhrase
, но учитывает только до 4 уникальных значений. Если более 4 уникальных значений UserID
для SearchPhrase
, функция возвращает 5 (4 + 1). Затем выражение HAVING
фильтрует значения SearchPhrase
, для которых количество уникальных значений UserID
меньше 5. Это даст вам список поисковых ключевых слов, которые использовались как минимум 5 уникальными пользователями.
sumMapFiltered
Эта функция работает так же, как sumMap, за исключением того, что она также принимает массив ключей для фильтрации в качестве параметра. Это может быть особенно полезно при работе с высокой кардинальностью ключей.
Синтаксис
sumMapFiltered(keys_to_keep)(keys, values)
Параметры
Возвращаемое значение
- Возвращает кортеж из двух массивов: ключи в отсортированном порядке и значения, суммированные для соответствующих ключей.
Пример
Запрос:
Результат:
sumMapFilteredWithOverflow
Эта функция работает так же, как sumMap, за исключением того, что она также принимает массив ключей для фильтрации в качестве параметра. Это может быть особенно полезно при работе с высокой кардинальностью ключей. Она отличается от функции sumMapFiltered тем, что выполняет суммирование с переполнением – т.е. возвращает тот же тип данных для суммирования, что и тип данных аргумента.
Синтаксис
sumMapFilteredWithOverflow(keys_to_keep)(keys, values)
Параметры
Возвращаемое значение
- Возвращает кортеж из двух массивов: ключи в отсортированном порядке и значения, суммированные для соответствующих ключей.
Пример
В этом примере мы создаем таблицу sum_map
, вставляем в нее некоторые данные, а затем используем как sumMapFilteredWithOverflow
, так и sumMapFiltered
и функцию toTypeName
для сравнения результатов. Где requests
был типа UInt8
в созданной таблице, sumMapFiltered
повысил тип суммируемых значений до UInt64
, чтобы избежать переполнения, в то время как sumMapFilteredWithOverflow
сохранил тип в UInt8
, который недостаточно велик, чтобы хранить результат – т.е. произошло переполнение.
Запрос:
Результат:
sequenceNextNode
Возвращает значение следующего события, которое соответствовало цепочке событий.
Экспериментальная функция, SET allow_experimental_funnel_functions = 1
, чтобы включить ее.
Синтаксис
Параметры
-
direction
— Используется для навигации по направлениям.- forward — Движение вперед.
- backward — Движение назад.
-
base
— Используется для установки базовой точки.- head — Установите базовую точку на первое событие.
- tail — Установите базовую точку на последнее событие.
- first_match — Установите базовую точку на первое соответствующее
event1
. - last_match — Установите базовую точку на последнее соответствующее
event1
.
Аргументы
timestamp
— Название колонки, содержащей временную метку. Поддерживаемые типы данных: Date, DateTime и другие беззнаковые целые типы.event_column
— Название колонки, содержащей значение следующего события, которое необходимо вернуть. Поддерживаемые типы данных: String и Nullable(String).base_condition
— Условие, которое должна выполнять базовая точка.event1
,event2
, ... — Условия, описывающие цепочку событий. UInt8.
Возвращаемые значения
event_column[next_index]
— Если шаблон совпадает и существует следующее значение.NULL
- Если шаблон не совпадает или следующее значение не существует.
Тип: Nullable(String).
Пример
Это можно использовать, когда события являются A->B->C->D->E, и вы хотите знать событие, следующее за B->C, которое является D.
Запрос для поиска события, следущего за A->B:
Результат:
Поведение для forward
и head
Поведение для backward
и tail
Поведение для forward
и first_match
Поведение для backward
и last_match
Поведение для base_condition