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

状态段合并

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

设备每隔一段时间上报一次状态。把每台设备按时间顺序相邻、状态相同的上报合并成一个状态段。

  • 按 device 分别处理,组内按 ts 升序(同一设备的 ts 不重复;输入行的顺序是乱的)。
  • 相邻两条状态相同就属于同一段;状态变了就开始新段。同一状态隔开后再次出现,算新的一段(ok, err, ok 是 3 段)。
  • status 可能为 null,表示“未知”:null 视为一种独立的状态——相邻的多个 null 合并成一段,null 与任何非 null 状态都不同。
  • 每段输出一行:start_ts 是段内第一条上报的时间,end_ts 是段内最后一条上报的时间(只有一条时两者相同)。

输入

  • status_log(device, ts, status):device、status 为 string,ts 为 datetime

输出

列为 device, status, start_ts, end_ts,null 段的 status 输出 null。行顺序不限。

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

status_log local/base/status_log
#devicestringtsdatetimestatusstring
1 A 2026-05-01 08:20:00 ok
2 B 2026-05-01 08:02:00 ok
3 A 2026-05-01 08:00:00 ok
4 A 2026-05-01 08:10:00 err
5 B 2026-05-01 08:12:00 offline
6 A 2026-05-01 08:30:00 ok
7 B 2026-05-01 08:07:00 ok
8 A 2026-05-01 08:05:00 ok
9 C 2026-05-01 09:00:00 err
10 B 2026-05-01 08:17:00 ok
11 A 2026-05-01 08:15:00 err
12 B 2026-05-01 08:22:00 offline
13 A 2026-05-01 08:25:00 ok
14 B 2026-05-01 08:27:00 offline
共 14 行

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

#deviceStringstatusStringstart_tsDatetime(time_unit='us', time_zone=None)end_tsDatetime(time_unit='us', time_zone=None)
1 A ok 2026-05-01 08:00:00 2026-05-01 08:05:00
2 A err 2026-05-01 08:10:00 2026-05-01 08:15:00
3 A ok 2026-05-01 08:20:00 2026-05-01 08:30:00
4 C err 2026-05-01 09:00:00 2026-05-01 09:00:00
5 B offline 2026-05-01 08:22:00 2026-05-01 08:27:00
6 B ok 2026-05-01 08:02:00 2026-05-01 08:07:00
7 B offline 2026-05-01 08:12:00 2026-05-01 08:12:00
8 B ok 2026-05-01 08:17:00 2026-05-01 08:17:00
共 8 行