Параметрические агрегатные функции
Некоторые агрегатные функции могут принимать не только столбцы-аргументы (используемые для сжатия), но и набор параметров — констант для инициализации. В синтаксисе для этого используются две пары круглых скобок вместо одной: первая — для параметров, вторая — для аргументов.
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'— учитывать каждое событие в цепочке только один раз, даже если оно удовлетворяет условию несколько раз.
Возвращаемое значение
Максимальное количество последовательных сработавших условий из цепочки в пределах скользящего временного окна. Анализируются все цепочки в выборке.
Тип: Integer.
Пример
Определить, достаточно ли заданного периода времени, чтобы пользователь выбрал телефон и купил его дважды в интернет‑магазине.
Задайте следующую цепочку событий:
- Пользователь вошёл в свой аккаунт в магазине (
eventID = 1003). - Пользователь ищет телефон (
eventID = 1007, product = 'phone'). - Пользователь оформил заказ (
eventID = 1009). - Пользователь оформил повторный заказ (
eventID = 1010).
Входная таблица:
Узнайте, как далеко пользователь user_id продвинулся по цепочке за период январь–февраль 2019 года.
Запрос:
Результат:
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
1970-01-01 09:00:01 3 Gift // Опорная точка, не сопоставлена с Home 1970-01-01 09:00:02 3 Home 1970-01-01 09:00:03 3 Gift 1970-01-01 09:00:04 3 Basket
Поведение режимов forward и first_match
Поведение backward и last_match
dt id page 1970-01-01 09:00:01 1 Home // Результат 1970-01-01 09:00:02 1 Gift // Базовая страница 1970-01-01 09:00:03 1 Exit
1970-01-01 09:00:01 2 Home 1970-01-01 09:00:02 2 Home // Результат 1970-01-01 09:00:03 2 Gift // Базовая страница 1970-01-01 09:00:04 2 Basket
1970-01-01 09:00:01 3 Gift 1970-01-01 09:00:02 3 Home // Результат 1970-01-01 09:00:03 3 Gift // Базовая страница 1970-01-01 09:00:04 3 Basket
Поведение параметра base_condition
dt id page ref 1970-01-01 09:00:01 1 A ref4 // Эта строка не может быть опорной точкой, потому что значение в столбце ref не совпадает с 'ref3'. 1970-01-01 09:00:02 1 A ref3 // Опорная точка 1970-01-01 09:00:03 1 B ref2 // Результат 1970-01-01 09:00:04 1 B ref1