Параметрические агрегатные функции
Некоторые агрегатные функции могут принимать не только столбцы-аргументы (используемые для сжатия), но и набор параметров — констант для инициализации. В синтаксисе для этого используются две пары круглых скобок вместо одной: первая — для параметров, вторая — для аргументов.
histogram
Вычисляет адаптивную гистограмму. Не гарантирует точных результатов.
Функция использует алгоритм A Streaming Parallel Decision Tree Algorithm. Границы корзин гистограммы корректируются по мере поступления новых данных в функцию. В общем случае ширины корзин могут различаться.
Аргументы
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), удовлетворяющих шаблону, из цепочки событий. Позиция в массиве соответствует позиции аргумента-условия в шаблоне.
Тип: Array.
Пример
Рассмотрим данные в таблице t:
Возвращает временные метки событий для наиболее длинной цепочки
См. также
windowFunnel
Ищет цепочки событий в скользящем временном окне и вычисляет максимальное число событий из цепочки, произошедших в этом окне.
Функция работает по следующему алгоритму:
-
Функция ищет данные, которые соответствуют первому условию в цепочке, и устанавливает счётчик событий равным 1. В этот момент начинается скользящее окно.
-
Если события из цепочки происходят последовательно в пределах окна, счётчик увеличивается. Если последовательность событий нарушается, счётчик не увеличивается.
-
Если в данных есть несколько цепочек событий с разной степенью завершённости, функция выводит только размер самой длинной цепочки.
Синтаксис
Аргументы
timestamp— имя столбца, содержащего метку времени. Поддерживаемые типы данных: Date, DateTime и другие беззнаковые целочисленные типы (обратите внимание, что хотяtimestampподдерживает тип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'— учитывать каждое событие в цепочке только один раз, даже если оно удовлетворяет условию несколько раз.'allow_reentry'— игнорировать события, нарушающие строгий порядок. Например, в случаеA->A->B->Cбудет найденоA->B->Cза счёт игнорирования лишнегоA, и максимальный уровень события равен 3.
Возвращаемое значение
Максимальное количество последовательных сработавших условий из цепочки в пределах скользящего временного окна. Анализируются все цепочки в выборке.
Тип: Integer.
Пример
Определить, достаточно ли заданного периода времени, чтобы пользователь выбрал телефон и купил его дважды в интернет‑магазине.
Задайте следующую цепочку событий:
- Пользователь вошёл в свой аккаунт в магазине (
eventID = 1003). - Пользователь ищет телефон (
eventID = 1007, product = 'phone'). - Пользователь оформил заказ (
eventID = 1009). - Пользователь оформил повторный заказ (
eventID = 1010).
Входная таблица:
Узнайте, как далеко пользователь user_id продвинулся по цепочке за период январь–февраль 2019 года.
Пример с режимом allow_reentry
Этот пример демонстрирует, как режим allow_reentry работает с шаблонами повторных входов пользователей.
retention
Функция принимает в качестве аргументов набор из 1–32 условий типа UInt8, которые указывают, было ли выполнено определённое условие для события.
Любое условие может быть указано в качестве аргумента (как в WHERE).
Условия, кроме первого, применяются попарно: результат второго будет true, если первое и второе истинны; третьего — если первое и третье истинны и т. д.
Синтаксис
Аргументы
cond— выражение, которое возвращает результат типаUInt8(1 или 0).
Возвращаемое значение
Массив значений 1 или 0.
- 1 — условие было выполнено для события.
- 0 — условие не было выполнено для события.
Тип: UInt8.
Пример
Рассмотрим пример вычисления функции retention для определения трафика сайта.
1. Создайте таблицу для иллюстрации.
Входная таблица:
2. Сгруппируйте пользователей по уникальному идентификатору 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 уникальных значений. Если для какого-либо SearchPhrase существует более 4 уникальных значений UserID, функция возвращает 5 (4 + 1). Затем условие HAVING отфильтровывает значения SearchPhrase, для которых количество уникальных значений UserID меньше 5. В результате вы получите список поисковых запросов, которые использовались как минимум 5 уникальными пользователями.
sumMapFiltered
Эта функция ведёт себя так же, как sumMap, за исключением того, что она также принимает в качестве параметра массив ключей для фильтрации. Это может быть особенно полезно при работе с высокой кардинальностью ключей.
Синтаксис
sumMapFiltered(keys_to_keep)(keys, values)
Параметры
keys_to_keep: Array — массив ключей, по которым выполняется фильтрация.keys: Array — массив ключей.values: Array — массив значений.
Возвращаемое значение
- Возвращает кортеж из двух массивов: ключи в отсортированном порядке и значения, суммированные по соответствующим ключам.
Пример
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