Перейти к основному содержимому
Версия: 2.0.x

window_funnel

Ищет цепочку событий в скользящем окне и вычисляет максимальное количество последовательных событий в цепочке событий. Эта функция обычно используется для анализа конверсии. Поддерживается начиная с версии 2.3.

Эта функция работает согласно следующим правилам:

  • Она начинает подсчёт с первого события в цепочке событий. Если первое событие найдено, счётчик событий устанавливается в 1 и скользящее окно начинается. Если первое событие не найдено, возвращается 0.

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

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

Синтаксис

BIGINT window_funnel(BIGINT window, DATE|DATETIME time, INT mode, array[cond1, cond2, ..., condN])

Параметры

  • window: Длина скользящего окна. Поддерживаемый тип данных — BIGINT. Единица измерения зависит от параметра time. Если тип данных time — DATE, единица измерения — дни. Если тип данных time — DATETIME, единица измерения — секунды.

  • time: Столбец, содержащий временные метки. Поддерживаются типы DATE и DATETIME.

  • mode: Режим фильтрации цепочки событий. Поддерживаемый тип данных — INT. Диапазон значений: 0, 1, 2.

    • 0 — значение по умолчанию, указывает на обычное вычисление воронки.
    • 1 указывает на режим DEDUPLICATION, то есть отфильтрованная цепочка событий не может содержать повторяющиеся события. Предположим, параметр array равен [event_type = 'A', event_type = 'B', event_type = 'C', event_type = 'D'], а исходная цепочка событий — "A-B-C-B-D". Событие B повторяется, и отфильтрованная цепочка событий — "A-B-C".
    • 2 указывает на режим FIXED, то есть отфильтрованная цепочка событий не может содержать события, нарушающие указанную последовательность. Предположим, используется предыдущий параметр array, а исходная цепочка событий — "A-B-D-C". Событие D нарушает последовательность, и отфильтрованная цепочка событий — "A-B".
    • 4 указывает на режим INCREASE, что означает, что отфильтрованные события должны иметь строго возрастающие временные метки. Дублирующиеся временные метки нарушают цепочку событий. Этот режим поддерживается начиная с версии 2.5.
  • array: Определённая цепочка событий. Должна быть массивом.

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

Возвращает значение типа BIGINT.

Примеры

Пример 1: Вычислить максимальное количество последовательных событий на основе uid. Скользящее окно — 1800 секунд, режим фильтрации — 0.

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

mysql> select * from action;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 1 | Click | 2020-01-02 11:10:00 |
| 1 | Order | 2020-01-02 11:20:00 |
| 1 | Pay | 2020-01-02 11:30:00 |
| 1 | Browse | 2020-01-02 11:00:00 |
| 2 | Order | 2020-01-02 11:00:00 |
| 2 | Pay | 2020-01-02 11:10:00 |
| 3 | Browse | 2020-01-02 11:20:00 |
| 3 | Click | 2020-01-02 12:00:00 |
| 4 | Browse | 2020-01-02 11:50:00 |
| 4 | Click | 2020-01-02 12:00:00 |
| 5 | Browse | 2020-01-02 11:50:00 |
| 5 | Click | 2020-01-02 12:00:00 |
| 5 | Order | 2020-01-02 11:10:00 |
| 6 | Browse | 2020-01-02 11:50:00 |
| 6 | Click | 2020-01-02 12:00:00 |
| 6 | Order | 2020-01-02 12:10:00 |
+------+------------+---------------------+
17 rows in set (0.01 sec)

Выполните следующий запрос:

select uid,
window_funnel(1800,time,0,[event_type='Browse', event_type='Click',
event_type='Order', event_type='Pay']) AS level
from action
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 4 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 3 |
+------+-------+

Описание результатов:

  • Соответствующая цепочка событий для uid = 1 — "Browse-Click-Order-Pay", возвращается 4. Время последнего события "Browse" (2020-01-02 11:00:00) не соответствует условию и не учитывается.

  • Цепочка событий для uid = 2 не начинается с первого события "Browse", возвращается 0.

  • Соответствующая цепочка событий для uid = 3 — "Browse", возвращается 1. Событие "Click" превышает временное окно в 1800 секунд и не учитывается.

  • Соответствующая цепочка событий для uid = 4 — "Browse-Click", возвращается 2.

  • Соответствующая цепочка событий для uid = 5 — "Browse-Click", возвращается 2. Событие "Order" (2020-01-02 11:10:00) не принадлежит цепочке событий и не учитывается.

  • Соответствующая цепочка событий для uid = 6 — "Browse-Click-Order", возвращается 3.

Пример 2: Вычислить максимальное количество последовательных событий на основе uid. Скользящее окно — 1800 секунд, используются режимы фильтрации 0 и 1.

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

mysql> select * from action1 order by time;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 2 | Browse | 2020-01-02 11:00:01 |
| 1 | Click | 2020-01-02 11:10:00 |
| 1 | Order | 2020-01-02 11:29:00 |
| 1 | Click | 2020-01-02 11:29:50 |
| 1 | Pay | 2020-01-02 11:30:00 |
| 1 | Click | 2020-01-02 11:40:00 |
+------+------------+---------------------+
7 rows in set (0.03 sec)

Выполните следующий запрос:

select uid,
window_funnel(1800,time,0,[event_type='Browse',
event_type='Click', event_type='Order', event_type='Pay']) AS level
from action1
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 4 |
| 2 | 1 |
+------+-------+
2 rows in set (0.02 sec)

Для uid = 1 событие "Click" (2020-01-02 11:29:50) является повторяющимся событием, но оно всё равно учитывается, поскольку используется режим 0. Поэтому возвращается 4.

Измените mode на 1 и выполните запрос снова.

+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 1 |
+------+-------+
2 rows in set (0.05 sec)

Самая длинная цепочка событий после дедупликации — "Browse-Click-Order", возвращается 3.

Пример 3: Вычислить максимальное количество последовательных событий на основе uid. Скользящее окно — 1900 секунд, используются режимы фильтрации 0 и 2.

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

mysql> select * from action2 order by time;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 2 | Browse | 2020-01-02 11:00:01 |
| 1 | Click | 2020-01-02 11:10:00 |
| 1 | Pay | 2020-01-02 11:30:00 |
| 1 | Order | 2020-01-02 11:31:00 |
+------+------------+---------------------+
5 rows in set (0.01 sec)

Выполните следующий запрос:

select uid,
window_funnel(1900,time,0,[event_type='Browse', event_type='Click',
event_type='Order', event_type='Pay']) AS level
from action2
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 1 |
+------+-------+
2 rows in set (0.02 sec)

Для uid = 1 возвращается 3, поскольку используется режим 0, и событие "Pay" (2020-01-02 11:30:00) не нарушает цепочку событий.

Измените mode на 2 и выполните запрос снова.

select uid,
window_funnel(1900,time,2,[event_type='Browse', event_type='Click',
event_type='Order', event_type='Pay']) AS level
from action2
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 2 |
| 2 | 1 |
+------+-------+
2 rows in set (0.06 sec)

Возвращается 2, поскольку событие "Pay" нарушает цепочку событий, и счётчик событий останавливается. Отфильтрованная цепочка событий — "Browse-Click".

Пример 4: Вычислить максимальное количество последовательных событий на основе uid. Скользящее окно — 1900 секунд, используются режимы фильтрации 0 и 4.

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

select * from action3 order by time;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 1 | Click | 2020-01-02 11:00:01 |
| 2 | Browse | 2020-01-02 11:00:03 |
| 1 | Order | 2020-01-02 11:00:31 |
| 2 | Click | 2020-01-02 11:00:03 |
| 2 | Order | 2020-01-02 11:01:03 |
+------+------------+---------------------+
3 rows in set (0.02 sec)

Выполните следующий запрос:

select uid,
window_funnel(1900,time,0,[event_type='Browse', event_type='Click',
event_type='Order']) AS level
from action3
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 3 |
+------+-------+

Для uid = 1 и uid = 2 возвращается 3.

Измените mode на 4 и выполните запрос снова.

select uid,
window_funnel(1900,time,4,[event_type='Browse', event_type='Click',
event_type='Order']) AS level
from action3
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 1 |
+------+-------+
1 row in set (0.02 sec)

Для uid = 2 возвращается 1, поскольку используется режим 4 (строго возрастающий). "Click" происходит в ту же секунду, что и "BROWSE". Поэтому "Click" и "Order" не учитываются.

Ключевые слова

window funnel, funnel, window_funnel