df-drills pandas · Polars · DuckDB SQL · DuckDB Relational 题目列表 登录

漏斗转化

困难 21-classic 面试经典题型 funnelsequencenon-equi-joinmin

统计购买漏斗 view → add_to_cart → checkout → purchase 每一步到达的用户数。

  • 以用户为单位(不切会话),只看这 4 种 event_type,其他类型忽略。
  • 用户“到达第 k 步”的定义:能在他的事件里依次找到第 1 步、第 2 步……第 k 步的事件各一个,并且它们的时间严格递增(后一步的 ts 必须严格晚于前一步;同一秒发生的不算先后)。
  • 例如:先 purchase 后 view 的用户只到达第 1 步;add_to_cart 只发生在 view 之前的用户只到达第 1 步;没有 view 的用户一步都没到达。
  • 每一步的用户数都包括到达更深步骤的用户(漏斗是逐级包含的);没人到达时为 0。

输入

  • events(event_id, user_id, ts, event_type, page)

输出

一行,列为 viewed, carted, checked_out, purchased,分别是到达第 1、2、3、4 步的用户数(整数)。

输入表 (case base,共 2 个 case:base、edge)

events web/events
#event_idint64user_idint64tsdatetimeevent_typestringpagestring
1 1 53 2026-06-03 17:57:33 login /home
2 2 53 2026-06-04 15:21:00 visit /home
3 3 53 2026-06-04 15:22:00 view /product/303
4 4 53 2026-06-04 15:32:04 add_to_cart /cart
5 5 56 2026-06-05 23:24:19 login /home
6 6 56 2026-06-05 23:29:18 view /product/202
7 7 56 2026-06-05 23:36:15 view /product/202
8 8 56 2026-06-05 23:47:36 add_to_cart /cart
9 9 56 2026-06-05 23:56:24 checkout /checkout
10 10 56 2026-06-06 19:14:00 visit /home
11 11 56 2026-06-06 19:22:53 view /product/303
12 12 56 2026-06-06 19:25:12 view /home
13 13 56 2026-06-06 19:28:25 add_to_cart /cart
14 14 29 2026-06-07 10:40:01 login /home
15 15 29 2026-06-07 10:46:43 view /product/303
16 16 29 2026-06-07 11:04:46 add_to_cart /cart
17 17 29 2026-06-07 11:09:25 checkout /checkout
18 18 34 2026-06-07 12:57:49 login /home
19 19 34 2026-06-07 13:03:57 view /product/202
20 20 34 2026-06-07 13:11:07 view /home
显示前 20 行,共 1500 行

期望输出 (case base,行顺序不限)

#viewedInt64cartedInt64checked_outInt64purchasedInt64
1 60 55 46 39
共 1 行