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

最大同时在线

困难 21-classic 面试经典题型 sweep-lineintervalscumsumunion

sessions 记录了每次在线会话的开始和结束时间。求同时在线的最大会话数,以及最早达到这个最大值的时刻。

  • 每个会话在线的时间是左闭右开区间 [start_ts, end_ts):开始时刻算在线,结束时刻视为已离开。所以一个会话在 t 结束、另一个在 t 开始,两者不算同时在线。
  • start_ts = end_ts 的会话时长为 0,任何时刻都不算在线。其余会话都有 end_ts > start_ts,没有 null。
  • 同一用户的多个会话分别计数(数的是会话,不是去重用户)。
  • first_ts:在线数第一次等于最大值的那个时刻(一定是某个会话的开始时刻)。最大值出现过多次时,取最早的一次。

输入

  • sessions(session_id, user_id, start_ts, end_ts):start_ts、end_ts 为 datetime

输出

一行,列为 max_online(整数)、first_ts(datetime)。

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

sessions local/base/sessions
#session_idint64user_idint64start_tsdatetimeend_tsdatetime
1 1 1 2026-07-01 08:00:00 2026-07-01 09:30:00
2 2 2 2026-07-01 08:15:00 2026-07-01 08:45:00
3 3 3 2026-07-01 08:20:00 2026-07-01 10:00:00
4 4 4 2026-07-01 08:40:00 2026-07-01 09:00:00
5 5 1 2026-07-01 09:45:00 2026-07-01 11:00:00
6 6 5 2026-07-01 09:50:00 2026-07-01 10:10:00
7 7 6 2026-07-01 10:05:00 2026-07-01 10:30:00
8 8 2 2026-07-01 10:06:00 2026-07-01 10:20:00
9 9 7 2026-07-01 12:00:00 2026-07-01 12:30:00
10 10 8 2026-07-01 12:10:00 2026-07-01 13:00:00
11 11 9 2026-07-01 12:15:00 2026-07-01 12:20:00
12 12 3 2026-07-01 12:18:00 2026-07-01 12:40:00
共 12 行

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

#max_onlineInt64first_tsDatetime(time_unit='us', time_zone=None)
1 4 2026-07-01 08:40:00
共 1 行