WINDOW_FUNNEL
描述
WINDOW_FUNNEL 函数用于分析用户行为序列,它在指定的时间窗口内搜索事件链,并计算事件链中完成的最大步骤数。这个函数特别适用于转化漏斗分析,比如分析用户从访问网站到最终购买的转化过程。
漏斗分析函数按照如下算法工作:
- 搜索到满足满足条件的第一个事件,设置事件长度为 1,此时开始滑动时间窗口计时。
- 如果事件在时间窗口内按照指定的顺序发生,时间长度累计增加。如果事件没有按照指定的顺序发生,时间长度不增加。
- 如果搜索到多个事件链,漏斗分析函数返回最大的长度。
语法
1WINDOW_FUNNEL(<window>, <mode>, <timestamp>, <event_1>[, event_2, ... , event_n])
参数
| 参数 | 说明 |
|---|---|
<window> |
滑动时间窗口大小,单位为秒 |
<mode> |
模式,共有四种模式,分别为default, deduplication, fixed, increase,详细请参见下面的模式 |
<timestamp> |
指定时间列,类型为 DATETIME, 滑动窗口沿着此列工作 |
<event_n> |
表示事件的布尔表达式。 |
模式
- default: 默认模式。
- deduplication: 当某个事件重复发生时,这个重复发生的事件会阻止后续的处理过程。如,指定事件链为[event1='A', event2='B', event3='C', event4='D'],原始事件链为"A-B-C-B-D"。由于 B 事件重复,最终的结果事件链为 A-B-C,最大长度为 3。
- fixed: 不允许事件的顺序发生交错,即事件发生的顺序必须和指定的事件链顺序一致。如,指定事件链为[event1='A', event2='B', event3='C', event4='D'],原始事件链为"A-B-D-C",则结果事件链为 A-B,最大长度为 2
- increase: 选中的事件的时间戳必须按照指定事件链严格递增。
返回值
返回一个整数,表示在指定时间窗口内完成的最大连续步骤数。
举例
举例 1: default 模式
使用默认模式,筛选出不同user_id对应的最大连续事件数,时间窗口为5分钟:
1CREATE TABLE events(
2 user_id BIGINT,
3 event_name VARCHAR(64),
4 event_timestamp datetime,
5 phone_brand varchar(64),
6 tab_num int
7) distributed by hash(user_id) buckets 3 properties("replication_num" = "1");
8
9INSERT INTO
10 events
11VALUES
12 (100123, '登录', '2022-05-14 10:01:00', 'HONOR', 1),
13 (100123, '访问', '2022-05-14 10:02:00', 'HONOR', 2),
14 (100123, '下单', '2022-05-14 10:04:00', 'HONOR', 3),
15 (100123, '付款', '2022-05-14 10:10:00', 'HONOR', 4),
16 (100125, '登录', '2022-05-15 11:00:00', 'XIAOMI', 1),
17 (100125, '访问', '2022-05-15 11:01:00', 'XIAOMI', 2),
18 (100125, '下单', '2022-05-15 11:02:00', 'XIAOMI', 6),
19 (100126, '登录', '2022-05-15 12:00:00', 'IPHONE', 1),
20 (100126, '访问', '2022-05-15 12:01:00', 'HONOR', 2),
21 (100127, '登录', '2022-05-15 11:30:00', 'VIVO', 1),
22 (100127, '访问', '2022-05-15 11:31:00', 'VIVO', 5);
23
24SELECT
25 user_id,
26 window_funnel(
27 300,
28 "default",
29 event_timestamp,
30 event_name = '登录',
31 event_name = '访问',
32 event_name = '下单',
33 event_name = '付款'
34 ) AS level
35FROM
36 events
37GROUP BY
38 user_id
39order BY
40 user_id;
1+---------+-------+
2| user_id | level |
3+---------+-------+
4| 100123 | 3 |
5| 100125 | 3 |
6| 100126 | 2 |
7| 100127 | 2 |
8+---------+-------+
对于uesr_id=100123,因为付款事件发生的时间超出了时间窗口,所以匹配到的事件链是登陆-访问-下单。
举例 2: deduplication 模式
使用deduplication模式,筛选出不同user_id对应的最大连续事件数,时间窗口为1小时:
1CREATE TABLE events(
2 user_id BIGINT,
3 event_name VARCHAR(64),
4 event_timestamp datetime,
5 phone_brand varchar(64),
6 tab_num int
7) distributed by hash(user_id) buckets 3 properties("replication_num" = "1");
8
9INSERT INTO
10 events
11VALUES
12 (100123, '登录', '2022-05-14 10:01:00', 'HONOR', 1),
13 (100123, '访问', '2022-05-14 10:02:00', 'HONOR', 2),
14 (100123, '登录', '2022-05-14 10:03:00', 'HONOR', 3),
15 (100123, '下单', '2022-05-14 10:04:00', "HONOR", 4),
16 (100123, '付款', '2022-05-14 10:10:00', 'HONOR', 4),
17 (100125, '登录', '2022-05-15 11:00:00', 'XIAOMI', 1),
18 (100125, '访问', '2022-05-15 11:01:00', 'XIAOMI', 2),
19 (100125, '下单', '2022-05-15 11:02:00', 'XIAOMI', 6),
20 (100126, '登录', '2022-05-15 12:00:00', 'IPHONE', 1),
21 (100126, '访问', '2022-05-15 12:01:00', 'HONOR', 2),
22 (100127, '登录', '2022-05-15 11:30:00', 'VIVO', 1),
23 (100127, '访问', '2022-05-15 11:31:00', 'VIVO', 5);
24
25SELECT
26 user_id,
27 window_funnel(
28 3600,
29 "deduplication",
30 event_timestamp,
31 event_name = '登录',
32 event_name = '访问',
33 event_name = '下单',
34 event_name = '付款'
35 ) AS level
36FROM
37 events
38GROUP BY
39 user_id
40order BY
41 user_id;
1+---------+-------+
2| user_id | level |
3+---------+-------+
4| 100123 | 2 |
5| 100125 | 3 |
6| 100126 | 2 |
7| 100127 | 2 |
8+---------+-------+
对于uesr_id=100123,匹配到访问事件后,登录事件重复出现,所以匹配到的事件链是登陆-访问。
举例 3: fixed 模式
使用fixed模式,筛选出不同user_id对应的最大连续事件数,时间窗口为1小时:
1CREATE TABLE events(
2 user_id BIGINT,
3 event_name VARCHAR(64),
4 event_timestamp datetime,
5 phone_brand varchar(64),
6 tab_num int
7) distributed by hash(user_id) buckets 3 properties("replication_num" = "1");
8
9INSERT INTO
10 events
11VALUES
12 (100123, '登录', '2022-05-14 10:01:00', 'HONOR', 1),
13 (100123, '访问', '2022-05-14 10:02:00', 'HONOR', 2),
14 (100123, '下单', '2022-05-14 10:03:00', "HONOR", 4),
15 (100123, '登录 2', '2022-05-14 10:04:00', 'HONOR', 3),
16 (100123, '付款', '2022-05-14 10:10:00', 'HONOR', 4),
17 (100125, '登录', '2022-05-15 11:00:00', 'XIAOMI', 1),
18 (100125, '访问', '2022-05-15 11:01:00', 'XIAOMI', 2),
19 (100125, '下单', '2022-05-15 11:02:00', 'XIAOMI', 6),
20 (100126, '登录', '2022-05-15 12:00:00', 'IPHONE', 1),
21 (100126, '访问', '2022-05-15 12:01:00', 'HONOR', 2),
22 (100127, '登录', '2022-05-15 11:30:00', 'VIVO', 1),
23 (100127, '访问', '2022-05-15 11:31:00', 'VIVO', 5);
24
25SELECT
26 user_id,
27 window_funnel(
28 3600,
29 "fixed",
30 event_timestamp,
31 event_name = '登录',
32 event_name = '访问',
33 event_name = '下单',
34 event_name = '付款'
35 ) AS level
36FROM
37 events
38GROUP BY
39 user_id
40order BY
41 user_id;
1+---------+-------+
2| user_id | level |
3+---------+-------+
4| 100123 | 3 |
5| 100125 | 3 |
6| 100126 | 2 |
7| 100127 | 2 |
8+---------+-------+
对于uesr_id=100123,匹配到下单事件后,事件链被登录2事件打断,所以匹配到的事件链是登陆-访问-下单。
举例 4: increase 模式
使用increase模式,筛选出不同user_id对应的最大连续事件数,时间窗口为1小时:
1CREATE TABLE events(
2 user_id BIGINT,
3 event_name VARCHAR(64),
4 event_timestamp datetime,
5 phone_brand varchar(64),
6 tab_num int
7) distributed by hash(user_id) buckets 3 properties("replication_num" = "1");
8
9INSERT INTO
10 events
11VALUES
12 (100123, '登录', '2022-05-14 10:01:00', 'HONOR', 1),
13 (100123, '访问', '2022-05-14 10:02:00', 'HONOR', 2),
14 (100123, '下单', '2022-05-14 10:04:00', "HONOR", 4),
15 (100123, '付款', '2022-05-14 10:04:00', 'HONOR', 4),
16 (100125, '登录', '2022-05-15 11:00:00', 'XIAOMI', 1),
17 (100125, '访问', '2022-05-15 11:01:00', 'XIAOMI', 2),
18 (100125, '下单', '2022-05-15 11:02:00', 'XIAOMI', 6),
19 (100126, '登录', '2022-05-15 12:00:00', 'IPHONE', 1),
20 (100126, '访问', '2022-05-15 12:01:00', 'HONOR', 2),
21 (100127, '登录', '2022-05-15 11:30:00', 'VIVO', 1),
22 (100127, '访问', '2022-05-15 11:31:00', 'VIVO', 5);
23
24SELECT
25 user_id,
26 window_funnel(
27 3600,
28 "increase",
29 event_timestamp,
30 event_name = '登录',
31 event_name = '访问',
32 event_name = '下单',
33 event_name = '付款'
34 ) AS level
35FROM
36 events
37GROUP BY
38 user_id
39order BY
40 user_id;
1+---------+-------+
2| user_id | level |
3+---------+-------+
4| 100123 | 3 |
5| 100125 | 3 |
6| 100126 | 2 |
7| 100127 | 2 |
8+---------+-------+
对于uesr_id=100123,付款事件的时间戳与下单事件的时间戳发生在同一秒,没有递增,所以匹配到的事件链是登陆-访问-下单。
