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

次日留存

困难 21-classic 面试经典题型 retentiondatesemi-joinleft-joinratio

按注册日期统计次日留存率。

  • 注册日期 signup_date = signup_ts 的日历日期。
  • “次日”是日历意义上的下一天:注册日期 + 1 天那一整天(00:00:00 到 23:59:59),与注册时刻相隔多少小时无关。例如 23:50 注册、次日 00:10 有事件算留存;注册当天晚些时候的事件、第 3 天 00:00:00 的事件都不算。跨月、跨年照常按日历顺延。
  • 用户在次日有任意类型的事件就算留存;次日有多个事件也只算 1 人。
  • signups 是该注册日期的注册人数(包括从来没有任何事件的用户);retained_d1 是其中次日留存的人数;rate = retained_d1 / signups,不舍入。
  • 每个出现过的注册日期都要输出一行,即使没有人留存(此时 retained_d1 = 0、rate = 0.0)。

输入

  • users(user_id, signup_ts, country, device):signup_ts 为 datetime
  • events(event_id, user_id, ts, event_type, page):ts 为 datetime

输出

列为 signup_date(date)、signups、retained_d1(整数)、rate(浮点),行顺序不限。

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

users web/users
#user_idint64signup_tsdatetimecountrystringdevicestring
1 1 2026-06-24 03:08:20 CN web
2 2 2026-06-20 22:19:20 DE web
3 3 2026-09-17 01:45:10 US android
4 4 2026-09-04 07:46:49 JP android
5 5 2026-07-17 14:10:25 CN ios
6 6 2026-07-26 18:38:11 JP android
7 7 2026-09-04 04:54:06 JP ios
8 8 2026-07-19 20:08:09 CN web
9 9 2026-08-09 06:02:40 JP web
10 10 2026-09-08 17:29:29 US android
11 11 2026-06-18 09:52:08 US ios
12 12 2026-08-28 19:51:40 CN android
13 13 2026-09-21 02:59:16 CN web
14 14 2026-08-11 14:56:25 CN android
15 15 2026-08-17 10:25:06 DE android
16 16 2026-06-23 14:41:12 US web
17 17 2026-09-04 08:22:08 CN android
18 18 2026-08-21 13:11:02 US web
19 19 2026-09-08 14:31:03 US ios
20 20 2026-07-14 14:21:42 JP web
显示前 20 行,共 60 行
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,行顺序不限)

#signup_dateDatesignupsInt64retained_d1Int64rateFloat64
1 2026-06-18 2 2 1.0
2 2026-08-11 1 1 1.0
3 2026-08-17 1 1 1.0
4 2026-09-08 2 1 0.5
5 2026-07-14 1 1 1.0
6 2026-09-01 1 1 1.0
7 2026-08-28 3 1 0.3333333333
8 2026-09-02 1 1 1.0
9 2026-08-19 1 1 1.0
10 2026-06-05 1 1 1.0
11 2026-07-29 1 1 1.0
12 2026-09-05 3 1 0.3333333333
13 2026-07-04 1 1 1.0
14 2026-08-24 1 1 1.0
15 2026-09-17 1 0 0.0
16 2026-07-17 1 0 0.0
17 2026-07-19 1 0 0.0
18 2026-06-23 1 0 0.0
19 2026-08-23 1 0 0.0
20 2026-09-09 1 0 0.0
21 2026-07-06 1 0 0.0
22 2026-06-17 1 0 0.0
23 2026-07-23 1 0 0.0
24 2026-09-20 1 0 0.0
25 2026-06-15 1 0 0.0
26 2026-06-24 2 1 0.5
27 2026-09-21 1 1 1.0
28 2026-07-15 1 1 1.0
29 2026-09-14 2 2 1.0
30 2026-06-07 2 1 0.5
31 2026-06-20 2 1 0.5
32 2026-09-07 1 1 1.0
33 2026-07-02 1 1 1.0
34 2026-09-22 1 1 1.0
35 2026-06-29 1 1 1.0
36 2026-06-03 1 1 1.0
37 2026-09-04 4 0 0.0
38 2026-07-26 1 0 0.0
39 2026-08-09 2 0 0.0
40 2026-08-21 1 0 0.0
41 2026-09-10 1 0 0.0
42 2026-07-30 1 0 0.0
43 2026-07-10 1 0 0.0
44 2026-09-03 1 0 0.0
45 2026-07-01 1 0 0.0
46 2026-08-08 1 0 0.0
共 46 行