三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

KaiwuDB SampleDB 实战:五大分组窗口函数完整实操教程

KaiwuDB SampleDB 实战:五大分组窗口函数完整实操教程

本文面向物联网研发、数据分析师、DBA,聚焦 KaiwuDB 社区版 KWDB 的时序专属分组窗口函数。依托开源 SampleDB 完整示例工程,拆COUNT/EVENT/SESSION/STATE/TIME 五类窗口语法、适用场景与实操 SQL,配套交通监测可复现业务案例,读完可快速掌握时序数据流分段聚合分析方案。

  • 时序分析为什么需要专用分组窗口函数
  • KWDB 窗口函数是什么
  • 示例场景:交通流量监测
  • 五种窗口类型详解
    • 1. COUNT_WINDOW:按行数切分
    • 2. EVENT_WINDOW:按事件条件切分
    • 3. SESSION_WINDOW:按时间间隔切分会话
    • 4. STATE_WINDOW:按状态值变化切分
    • 5. TIME_WINDOW:按固定时间间隔切分
  • 五种窗口的横向对比
  • 快速上手
  • FAQ
  • 总结
  • 相关推荐:

时序分析为什么需要专用分组窗口函数

工业、在交通、新能源等物联网场景中,设备会持续产生并上报海量的时序数据点。日常分析需求常聚焦连续数据流分段统计:设备持续故障时长、车辆拥堵区间、设备运行状态分段、用户活跃会话等。传统GROUP BY仅支持固定时间桶聚合,无法识别动态事件、会话、状态边界,分析结果割裂失真。为此 KWDB 内置时序专属分组窗口函数,区别于标准 SQL 的OVER普通窗口,通过GROUP BY内置窗口算子,原生适配时序表连续数据流分段计算。

KWDB 窗口函数是什么

KWDB 的分组窗口函数(Group Window Function)是专为时序表设计的聚合机制。与传统数据库的解析窗口函数(OVER子句)不同,它通过GROUP BY子句指定切分规则,对每个窗口独立输出一行聚合结果。

语法结构如下:

SELECT select_list

其中group_window_function可以是以下五种之一:

COUNT_WINDOW(count_val[, sliding_val])

使用前有几个前提需要明确:

• 仅支持时序表单表查询,不支持嵌套、关联或联合查询。

• 必须出现在GROUP BY子句中,可以单独使用,也可与主标签(ptag)组合。

• 表内单个设备的数据应按时间戳有序且不重复

示例场景:交通流量监测

SampleDB 的窗口函数示例使用了一张名为ts_window.vehicles的时序表,模拟路边检测点采集的车辆过车数据:

CREATE TS DATABASE ts_window;

示例中共有 6 条数据:


6 条记录,时间跨度约 20 分钟,车速在 25~40 之间波动。这份数据看似简单,却足够演示所有 5 种窗口切分逻辑的差异。

五种窗口类型详解

1. COUNT_WINDOW:按行数切分

最直观的窗口类型------每 N 条记录划为一个窗口,也支持滑动步长。

场景:统计每 3 条过车记录的平均车速。

SELECT

6 条数据被平均切成 2 个窗口,每组各 3 条。如果加上滑动参数,每 2 条滑动一次,窗口之间会有重叠:

GROUP BY COUNT_WINDOW(3, 2)

注意:滑动值必须为正整数,且不能大于窗口行数。

2. EVENT_WINDOW:按事件条件切分

EVENT_WINDOW最适合捕捉"从某个状态到另一个状态"的完整过程。它接受两个条件表达式:开始触发条件和结束触发条件。

场景:识别低速拥堵事件------速度低于 30 时拥堵开始,速度回升到 35 及以上时拥堵结束。

SELECT

这种窗口天然契合异常检测、告警区间分析等场景,能把"一段时间内的连续异常"作为整体聚合,而不是被固定时间槽割裂。

3. SESSION_WINDOW:按时间间隔切分会话

SESSION_WINDOW模仿的是会话(Session)概念:只要相邻两条记录之间的时间间隔不超过容忍阈值,就认为它们属于同一个会话;一旦超出阈值,会话断开,下一条记录开启新会话。

场景:按 5 分钟最大连续间隔划分车流会话。

SELECT

结合示例数据逐条看间隔:12:01→12:02 间隔 1 分钟,同一会话;12:02→12:09 间隔 7 分钟,超过 5 分钟阈值,会话断开;12:09→12:11 间隔 2 分钟,开启新会话;12:11→12:12 间隔 1 分钟,同一会话;12:12→12:21 间隔 9 分钟,再次断开。最终切出 3 个会话:{12:01, 12:02}{12:09, 12:11, 12:12}{12:21}

注意:间隔参数支持smhdw,不支持1m2s这类复合格式。

4. STATE_WINDOW:按状态值变化切分

STATE_WINDOW监控某列(或表达式)的状态值,只要值不变就保持在同一窗口;一旦值发生变化,就切分出新窗口。这在设备状态追踪、运行模式分析中非常实用。

场景:将"低速(< 35)"与"非低速"作为状态量,分析各状态持续了多少条记录。

SELECT

提示STATE_WINDOW适合整型、布尔值和字符类型的状态列,不建议直接作用于连续浮点值。

5. TIME_WINDOW:按固定时间间隔切分

TIME_WINDOW是最常见的时间分桶方式,将时间轴按固定间隔等分,每个桶独立聚合。也支持设置滑动时间来实现滑动窗口(窗口间有重叠)。

场景:按 10 分钟固定窗口统计车流量。

SELECT

加上滑动参数,可以做每 5 分钟滑动一次的 10 分钟滑动窗口:

GROUP BY TIME_WINDOW(ts, '10m', '5m')

注意:滑动时间不应大于窗口大小,且两者差距也不建议过大。

五种窗口的横向对比

快速上手

SampleDB 的window/目录提供了完整的脚本,整个流程只需 4 步:

# 1. 启动 KWDB 单机服务

也可以直接一键执行:

bash window_test.sh

前提:将window/目录中的文件放到 KWDB 二进制目录下,且脚本仅支持 Linux 系统。

FAQ

Q1:KWDB 分组窗口和标准 SQL OVER 窗口有什么区别?
A1:OVER 窗口是行内附加计算,不合并输出多行聚合结果;KWDB 分组窗口写在 GROUP BY,自动分段聚合、每个窗口输出一条统计结果,原生适配海量时序数据流分段分析,性能远优于传统窗口。

Q2:KWDB 窗口函数能否和多标签同时分组?
A2:支持,GROUP BY location, lane_no, TIME_WINDOW(ts, ‘10m’),按道路 + 车道 + 时间多层聚合。

Q3:时序数据乱序会影响窗口切分结果吗?
A3:会,要求入库时序有序;乱序数据建议先按 ts 排序,或开启时序乱序缓冲参数。

总结

KWDB 的 5 种分组窗口函数各有侧重:TIME_WINDOW适合等时间槽统计,COUNT_WINDOW适合等样本量统计,SESSION_WINDOW适合活跃段识别,STATE_WINDOW适合状态跟踪,EVENT_WINDOW适合事件边界捕捉。

SampleDB 开源工程提供可直接运行的完整脚本,开发者可本地一键复现所有案例,快速落地车流、电力、工业设备时序分析业务。后续实战系列将带来窗口函数性能调优、亿级时序滑动窗口优化内容,欢迎持续关注。

相关推荐:

KaiwuDB SampleDB 实战:用 Agent Skill 逐步跑通 4 类 AIoT 示例
KaiwuDB SampleDB 实战:一文搞定聚合函数
KaiwuDB 开发者社区

最后更新:2026 年 08 月 07 日

← 返回列表