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

动态窗口参数

困难 23-polars-only Polars 专属 group-by-dynamictime-windowoverlapping-window

按传感器统计重叠的 2 小时时间窗口里的读数。

窗口规则:

  • 窗口起点都是整点过 30 分(hh:30:00),每隔 1 小时一个起点;每个窗口长 2 小时,区间左闭右开 [start, start + 2h)。所以相邻窗口重叠 1 小时,一条读数通常同时落在两个窗口里。
  • 每个传感器单独计算。该传感器的第一个窗口的起点,是不晚于它第一条读数的最近一个 hh:30:00(例如第一条读数在 00:23:47,第一个窗口从前一天 23:30:00 开始;第一条读数恰好在 00:30:00,就从 00:30:00 开始)。比第一个窗口更早的窗口一律不输出。
  • 只输出至少包含一条读数的窗口。

每个窗口输出:

  • window_start:窗口起点;
  • n:窗口内的读数行数(包括温度为 null 或坏读数的行);
  • avg_temp:窗口内 temperature 的平均值。-999 是坏读数,与 null 一样不参与平均;窗口内没有有效温度时为 null。不做舍入。

输入

  • readings(sensor_id, ts, temperature, humidity)

输出

列为 sensor_id, window_start, n, avg_temp,行顺序不限。

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

readings iot/readings
#sensor_idstringtsdatetimetemperaturefloat64humidityfloat64
1 s01 2026-09-01 00:23:47 21.7 60.2
2 s01 2026-09-01 00:45:48 22.1 60.2
3 s01 2026-09-01 00:59:29 22.2 46.2
4 s01 2026-09-01 01:12:53 22.3 51.3
5 s01 2026-09-01 01:37:08 22.5 43.4
6 s01 2026-09-01 01:55:18 22.5 57.9
7 s01 2026-09-01 02:03:26 22.3 39.0
8 s01 2026-09-01 02:09:39 22.1 58.2
9 s01 2026-09-01 02:21:34 22.2 41.0
10 s01 2026-09-01 02:33:45 22.4 63.2
11 s01 2026-09-01 02:46:42 null 47.4
12 s01 2026-09-01 02:56:58 null 37.0
13 s01 2026-09-01 03:12:50 null 55.3
14 s01 2026-09-01 03:28:54 22.4 44.3
15 s01 2026-09-01 03:44:24 22.3 49.2
16 s01 2026-09-01 03:55:27 22.1 42.7
17 s01 2026-09-01 04:02:14 21.9 51.5
18 s01 2026-09-01 04:21:37 -999.0 46.3
19 s01 2026-09-01 04:28:05 22.4 63.7
20 s01 2026-09-01 04:40:12 22.4 57.7
显示前 20 行,共 600 行

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

#sensor_idStringwindow_startDatetime(time_unit='us', time_zone=None)nUInt32avg_tempFloat64
1 s01 2026-08-31 23:30:00 4 22.075
2 s01 2026-09-01 00:30:00 8 22.275
3 s01 2026-09-01 01:30:00 10 22.34285714
4 s01 2026-09-01 02:30:00 10 22.25
5 s01 2026-09-01 03:30:00 8 22.08571429
6 s01 2026-09-01 04:30:00 7 21.97142857
7 s01 2026-09-01 05:30:00 9 22.13333333
8 s01 2026-09-01 06:30:00 9 22.33333333
9 s01 2026-09-01 07:30:00 7 22.55714286
10 s01 2026-09-01 08:30:00 7 23.04285714
11 s01 2026-09-01 09:30:00 7 23.4
12 s01 2026-09-01 10:30:00 7 23.18571429
13 s01 2026-09-01 11:30:00 5 22.94
14 s01 2026-09-01 12:30:00 1 23.1
15 s01 2026-09-01 16:30:00 4 22.775
16 s01 2026-09-01 17:30:00 8 22.45
17 s01 2026-09-01 18:30:00 9 21.76666667
18 s01 2026-09-01 19:30:00 9 21.9
19 s01 2026-09-01 20:30:00 7 22.3
20 s01 2026-09-01 21:30:00 6 22.2
21 s01 2026-09-01 22:30:00 8 22.5
22 s01 2026-09-01 23:30:00 10 22.7
23 s01 2026-09-02 00:30:00 9 22.36666667
24 s01 2026-09-02 01:30:00 8 21.8125
25 s01 2026-09-02 02:30:00 7 21.32857143
26 s01 2026-09-02 03:30:00 7 21.2
27 s01 2026-09-02 04:30:00 6 21.35
28 s01 2026-09-02 05:30:00 2 21.55
29 s02 2026-08-31 23:30:00 6 22.44
30 s02 2026-09-01 00:30:00 7 22.44
31 s02 2026-09-01 01:30:00 5 21.83333333
32 s02 2026-09-01 02:30:00 6 21.96666667
33 s02 2026-09-01 03:30:00 8 21.875
34 s02 2026-09-01 04:30:00 8 21.75
35 s02 2026-09-01 05:30:00 7 21.87142857
36 s02 2026-09-01 06:30:00 9 22.63333333
37 s02 2026-09-01 07:30:00 9 23.15555556
38 s02 2026-09-01 08:30:00 7 23.48571429
39 s02 2026-09-01 09:30:00 7 24.15714286
40 s02 2026-09-01 10:30:00 7 24.41428571
41 s02 2026-09-01 11:30:00 7 24.34285714
42 s02 2026-09-01 12:30:00 5 24.18
43 s02 2026-09-01 13:30:00 1 24.2
44 s02 2026-09-01 15:30:00 3 23.63333333
45 s02 2026-09-01 16:30:00 7 23.17142857
46 s02 2026-09-01 17:30:00 8 23.0125
47 s02 2026-09-01 18:30:00 8 23.0125
48 s02 2026-09-01 19:30:00 7 22.76
49 s02 2026-09-01 20:30:00 7 22.78
50 s02 2026-09-01 21:30:00 7 22.9
显示前 50 行,共 169 行