Перейти к основному содержимому
Перейти к основному содержимому

Параметрические агрегатные функции

Некоторые агрегатные функции могут принимать не только аргументные колонки (используемые для сжатия), но и набор параметров — константы для инициализации. Синтаксис состоит из двух пар скобок вместо одной. Первая скобка предназначена для параметров, а вторая — для аргументов.

histogram

Расчитывает адаптивную гистограмму. Она не гарантирует точные результаты.

Функция использует Алгоритм Параллельного Решения Деревьев. Границы ячеек гистограммы регулируются по мере поступления новых данных в функцию. В общем случае ширины ячеек не равны.

Аргументы

valuesВыражение, получающее входные значения.

Параметры

number_of_bins — Верхний предел для количества ячеек в гистограмме. Функция автоматически рассчитывает количество ячеек. Она пытается достичь указанного количества ячеек, но если не удается, использует меньшее количество ячеек.

Возвращаемые значения

  • Массив Кортежей следующего формата:

    • lower — Нижняя граница ячейки.
    • upper — Верхняя граница ячейки.
    • height — Рассчитанная высота ячейки.

Пример

Вы можете визуализировать гистограмму с помощью функции bar, например:

В этом случае вам следует помнить, что вы не знаете границы ячеек гистограммы.

sequenceMatch

Проверяет, содержит ли последовательность цепочку событий, соответствующую шаблону.

Синтаксис

примечание

События, происходящие в одну секунду, могут находиться в последовательности в неопределенном порядке, что влияет на результат.

Аргументы

  • timestamp — Колонка, которая считается содержащей временные данные. Типичные типы данных: Date и DateTime. Вы также можете использовать любой из поддерживаемых UInt типов данных.

  • cond1, cond2 — Условия, описывающие цепочку событий. Тип данных: UInt8. Вы можете передать до 32 аргументов условия. Функция учитывает только события, описанные в этих условиях. Если последовательность содержит данные, которые не описаны в условии, функция пропускает их.

Параметры

Возвращаемые значения

  • 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 аргументов условия. Функция учитывает только события, описанные в этих условиях. Если последовательность содержит данные, которые не описаны в условии, функция пропускает их.

Параметры

Возвращаемые значения

  • Количество неперекрывающихся цепочек событий, которые соответствуют шаблону.

Тип: UInt64.

Пример

Рассмотрим данные в таблице t:

Посчитаем, сколько раз число 2 следует после числа 1 с любым количеством других чисел между ними:

sequenceMatchEvents

Возвращает временные метки событий для самых длинных цепочек событий, которые соответствуют шаблону.

примечание

События, происходящие в одну секунду, могут находиться в последовательности в неопределенном порядке, что влияет на результат.

Синтаксис

Аргументы

  • timestamp — Колонка, которая считается содержащей временные данные. Типичные типы данных: Date и DateTime. Вы также можете использовать любой из поддерживаемых UInt типов данных.

  • cond1, cond2 — Условия, описывающие цепочку событий. Тип данных: UInt8. Вы можете передать до 32 аргументов условия. Функция учитывает только события, описанные в этих условиях. Если последовательность содержит данные, которые не описаны в условии, функция пропускает их.

Параметры

Возвращаемые значения

  • Массив временных меток для совпадающих аргументов условий (?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.

Пример

Установите, достаточно ли заданного периода времени пользователю, чтобы выбрать телефон и купить его дважды в интернет-магазине.

Установите следующую цепочку событий:

  1. Пользователь вошел в свой аккаунт в магазине (eventID = 1003).
  2. Пользователь ищет телефон (eventID = 1007, product = 'phone').
  3. Пользователь оформляет заказ (eventID = 1009).
  4. Пользователь снова оформляет заказ (eventID = 1010).

Входная таблица:

Выясните, как далеко пользователь мог пройти по цепочке в период с января по февраль 2019 года.

Запрос:

Результат:

retention

Функция принимает в качестве аргументов набор условий от 1 до 32 аргументов типа UInt8, которые указывают, было ли выполнено определенное условие для события. Любое условие может быть указано в качестве аргумента (как в WHERE).

Условия, кроме первого, применяется парами: результат второго будет истинным, если истинны первое и второе, третье — если истинны первое и третье и т. д.

Синтаксис

Аргументы

  • cond — Выражение, возвращающее результат UInt8 (1 или 0).

Возвращаемое значение

Массив 1 или 0.

  • 1 — Условие было выполнено для события.
  • 0 — Условие не было выполнено для события.

Тип: UInt8.

Пример

Рассмотрим пример функции retention для определения трафика сайта.

1. Создайте таблицу для иллюстрации примера.

Входная таблица:

Запрос:

Результат:

2. Н agrupируйте пользователей по уникальному идентификатору uid, используя функцию retention.

Запрос:

Результат:

3. Рассчитайте общее количество посещений сайта по дням.

Запрос:

Результат:

Где:

  • r1 — количество уникальных посетителей, которые посетили сайт 1 января 2020 года (условие cond1).
  • r2 — количество уникальных посетителей, которые посетили сайт в определенный период времени между 1 и 2 января 2020 года (условия cond1 и cond2).
  • r3 — количество уникальных посетителей, которые посетили сайт в определенный период времени 1 и 3 января 2020 года (условия 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)

Параметры

Возвращаемое значение

  • Возвращает кортеж из двух массивов: ключи в отсортированном порядке и суммированные значения для соответствующих ключей.

Пример

Запрос:

Результат:

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