跳转到内容

与 ClickHouse 中的 windowFunnel 类似(二者由同一作者创建),它在滑动时间窗口中搜索事件链,并计算该链中事件的最大数量。

该函数按以下算法工作:

  • 函数搜索触发链中第一个条件的数据,并将事件计数器设为 1。这一时刻就是滑动窗口的起点。

  • 如果链中的事件在窗口内依次发生,计数器递增。如果事件序列中断,计数器不再递增。

  • 如果数据中存在多条处于不同完成阶段的事件链,函数只会输出最长事件链的长度。

WINDOW_FUNNEL( <window> )( <timestamp>, <cond1>, <cond2>, ..., <condN> )

参数

  • <timestamp>:包含时间戳的列名。支持的数据类型:整数类型和日期时间类型。
  • <cond>:描述事件链的条件或数据。必须是 Boolean 数据类型。

参数

  • <window>:滑动窗口的长度,即第一个条件与最后一个条件之间的时间间隔。window 的单位取决于 timestamp 本身,会有所不同。通过表达式 timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window 确定。

返回值

滑动时间窗口内,链中连续触发的条件的最大数量。 会分析所选数据中的所有事件链。

类型:UInt8。

示例

判断一段设定的时间是否足够让用户在网上商店中选择一部手机并购买两次。

设定如下事件链:

  1. 用户登录商店账户(event_name = 'login')。
  2. 用户进入页面(event_name = 'visit')。
  3. 用户加入购物车(event_name = 'cart')。
  4. 用户完成购买(event_name = 'purchase')。
CREATE TABLE events(user_id BIGINT, event_name VARCHAR, event_timestamp TIMESTAMP);
INSERT INTO events VALUES(100123, 'login', '2022-05-14 10:01:00');
INSERT INTO events VALUES(100123, 'visit', '2022-05-14 10:02:00');
INSERT INTO events VALUES(100123, 'cart', '2022-05-14 10:04:00');
INSERT INTO events VALUES(100123, 'purchase', '2022-05-14 10:10:00');
INSERT INTO events VALUES(100125, 'login', '2022-05-15 11:00:00');
INSERT INTO events VALUES(100125, 'visit', '2022-05-15 11:01:00');
INSERT INTO events VALUES(100125, 'cart', '2022-05-15 11:02:00');
INSERT INTO events VALUES(100126, 'login', '2022-05-15 12:00:00');
INSERT INTO events VALUES(100126, 'visit', '2022-05-15 12:01:00');

输入表:

┌─────────┬────────────┬────────────────────────────┐
│ user_id │ event_name │ event_timestamp │
├─────────┼────────────┼────────────────────────────┤
│ 100123 │ login │ 2022-05-14 10:01:00.000000 │
│ 100123 │ visit │ 2022-05-14 10:02:00.000000 │
│ 100123 │ cart │ 2022-05-14 10:04:00.000000 │
│ 100123 │ purchase │ 2022-05-14 10:10:00.000000 │
│ 100125 │ login │ 2022-05-15 11:00:00.000000 │
│ 100125 │ visit │ 2022-05-15 11:01:00.000000 │
│ 100125 │ cart │ 2022-05-15 11:02:00.000000 │
│ 100126 │ login │ 2022-05-15 12:00:00.000000 │
│ 100126 │ visit │ 2022-05-15 12:01:00.000000 │
└─────────┴────────────┴────────────────────────────┘

查明在一小时滑动窗口内,用户 user_id 能走到事件链的哪一步。

查询:

SELECT
level,
count() AS count
FROM
(
SELECT
user_id,
window_funnel(3600000000)(event_timestamp, event_name = 'login', event_name = 'visit', event_name = 'cart', event_name = 'purchase') AS level
FROM events
GROUP BY user_id
)
GROUP BY level ORDER BY level ASC;

结果:

┌───────┬───────┐
│ level │ count │
├───────┼───────┤
│ 2 │ 1 │
│ 3 │ 1 │
│ 4 │ 1 │
└───────┴───────┘
  • 用户 100126 的 level 为 2(login -> visit)。
  • 用户 100125 的 level 为 3(login -> visit -> cart)。
  • 用户 100123 的 level 为 4(login -> visit -> cart -> purchase)。