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

连续登录 ≥ 3 天

困难 21-classic 面试经典题型 gaps-and-islandsstreakrow-numberdedupdate

找出“连续登录至少 3 天”的用户,并给出每人最长的连续登录天数。

  • 只看 event_type = 'login' 的事件,其他事件类型(即使发生在中间那天)都不算登录。
  • 登录日取 ts 的日历日期(ts 不带时区,直接取日期部分;23:59:59 和次日 00:00:00 属于相邻的两天)。
  • 同一用户同一天登录多次(包括同一秒的重复事件),只算 1 天。
  • “连续”指日期逐日相差 1 天,跨月、跨年照常连续。
  • 一个用户可能有多段连续登录,longest_streak 取其中最长的一段的天数。
  • 只输出 longest_streak ≥ 3 的用户。

输入

  • events(event_id, user_id, ts, event_type, page):事件流,ts 为 datetime

输出

列为 user_id, longest_streak(整数),每个满足条件的用户一行,行顺序不限。

输入表 (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,行顺序不限)

#user_idInt64longest_streakInt64
1 5 3
2 37 4
3 3 3
4 21 3
共 4 行