跳到主要内容
版本: 最新版本-3.5

window_funnel

在滑动窗口中搜索事件链,并计算事件链中连续事件的最大数量。此函数通常用于分析转化率。从 v2.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 的匹配事件链为“浏览-点击-下单-支付”,返回 4。“浏览”事件的最后一次时间 (2020-01-02 11:00:00) 不满足条件,因此不计数。

  • uid = 2 的事件链不是从第一个事件“浏览”开始的,因此返回 0

  • uid = 3 的匹配事件链为“浏览”,返回 1。“点击”事件超过了 1800 秒的时间窗口,因此不计数。

  • uid = 4 的匹配事件链为“浏览-点击”,返回 2

  • uid = 5 的匹配事件链为“浏览-点击”,返回 2。“下单”事件 (2020-01-02 11:10:00) 不属于事件链,因此不计数。

  • uid = 6 的匹配事件链为“浏览-点击-下单”,返回 3

示例 2:根据 uid 计算连续事件的最大数量。滑动窗口为 1800 秒,使用筛选模式 01

此示例使用表 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,“点击”事件 (2020-01-02 11:29:50) 是一个重复事件,但由于使用了模式 0,因此仍会计数。因此,返回 4

mode 更改为 1 并再次执行该语句。

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

去重后筛选出的最长事件链为“浏览-点击-下单”,返回 3

示例 3:根据 uid 计算连续事件的最大数量。滑动窗口为 1900 秒,使用筛选模式 02

此示例使用表 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,“支付”事件 (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,因为“支付”事件中断了事件链,事件计数器停止。筛选后的事件链为“浏览-点击”。

示例 4:根据 uid 计算连续事件的最大数量。滑动窗口为 1900 秒,使用筛选模式 04

此示例使用表 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 = 1uid = 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(严格递增)。“点击”事件与“浏览”事件发生在同一秒。因此,“点击”和“下单”不计数。

关键词

window funnel, funnel, window_funnel