滑动窗口与持续检测
# 滑动窗口与持续检测
# 业务场景
母线电流需要做"持续超阈值"告警:只有当过去 10 秒内的电流全部大于 200A(中间没有下跌)才算持续过载。每 2 秒滑动一次、看最近 10 秒,用 HAVING 把出现过下跌的窗口过滤掉。
# SQL
SELECT MIN(concurrency) AS mn,
COUNT(*) AS c
FROM stream
GROUP BY SlidingWindow('10s', '2s')
HAVING mn > 200
1
2
3
4
5
2
3
4
5
SlidingWindow('10s', '2s'):窗口大小 10s、每 2s 滑动一次,窗口之间有重叠(一个事件可能落在多个窗口里)。MIN(concurrency) AS mn:窗口内全部事件的最小值;只要有一个事件 ≤200,mn就 ≤200。HAVING mn > 200:只保留"窗口内全部 >200"的窗口,即持续过载段。
# 输入
一段时间内的电流读数(前 10s 全部 >200;中间出现一次 180 的下跌;之后恢复):
{"concurrency": 250, "ts": 1}
{"concurrency": 260, "ts": 3}
{"concurrency": 240, "ts": 5}
{"concurrency": 180, "ts": 7} // 下跌,包含它的窗口 min=180,被 HAVING 拦掉
{"concurrency": 270, "ts": 9}
{"concurrency": 280, "ts": 11}
1
2
3
4
5
6
2
3
4
5
6
# 输出
只有"窗口内全部 >200"的窗口通过 HAVING 输出;含 180 那次下跌的窗口被过滤:
{mn: 240 c: 3 ...} // 不含下跌的窗口
{mn: 270 c: 2 ...} // 下跌之后的窗口
(含 180 的窗口被 HAVING 拦掉,不输出)
1
2
3
2
3
# 行为说明
- 滑动窗口会重叠:每个事件可能进入多个窗口,所以同一段时间会产生多个输出点(每 2s 一个),比滚动窗口更平滑。
HAVING引用 SELECT 别名(mn),不能复述聚合函数(HAVING MIN(concurrency) > 200不生效)。- min 拦 dip 的原理:窗口聚合该 10s 内的全部事件(含下跌),
MIN一旦 <200,HAVING 就把它过滤——这正是"持续"语义。 - 区别:变更数据捕获用分析函数做"瞬时变化"检测;本案例用窗口聚合做"持续时段"检测,两者不要混。
如何运行
滑动窗口是聚合查询,用 Emit + AddSink 按批接收窗口结果。完整样板见如何运行案例 SQL。
# 📚 相关文档
- 如何运行案例 SQL
- SQL 参考 —— SlidingWindow、HAVING
- 变更数据捕获 —— 瞬时变化检测(分析函数)
在 GitHub 上编辑此页 (opens new window)
上次更新: 2026/07/11, 04:40:00