会话窗口与设备在线分析
# 会话窗口与设备在线分析
# 业务场景
设备的上报往往是"一阵一阵"的:上线后连续上报,停机时沉默。要把每次"在线活动"划分成一个会话——同一设备连续上报(间隔小于超时)归为同一会话,停报超过超时后会话关闭并输出该会话的统计(消息数、最后上报时间)。这类"按活动间隙切分"的需求用会话窗口。
# SQL
SELECT deviceId,
COUNT(*) AS msgs,
MAX(ts) AS last_ts
FROM stream
GROUP BY deviceId, SessionWindow('5s')
1
2
3
4
5
2
3
4
5
SessionWindow('5s'):同一 deviceId 内,相邻事件间隔小于 5s 的归为同一会话;间隔超过 5s 触发上一个会话关闭并输出。
# 输入
dev-01 在短时间内连发 3 条,然后停报;dev-02 只发 1 条:
{"deviceId": "dev-01", "ts": 1000}
{"deviceId": "dev-01", "ts": 2200}
{"deviceId": "dev-01", "ts": 3000}
{"deviceId": "dev-02", "ts": 1500}
1
2
3
4
2
3
4
(停报 5s 后,会话因超时关闭。)
# 输出
会话关闭时按批回调,每个设备的会话各一行:
{deviceId:dev-01 msgs:3 last_ts:3000}
{deviceId:dev-02 msgs:1 last_ts:1500}
1
2
2
# 行为说明
- 会话窗口按活动间隙(gap)切分,没有固定边界:来一条就扩展当前会话,超过
timeout没新数据就关闭。 GROUP BY deviceId, SessionWindow(...):每个设备各自维护会话,互不影响。- 会话窗口为处理时间语义(到点靠"超时无数据"触发);想在测试里立刻拿到输出,用
ssql.TriggerWindow()强制关闭当前会话,不必等满超时。 - 典型用途:用户/设备在线段、一次操作连续行为、按活动分桶的统计。
如何运行
会话窗口是聚合查询,用 Emit + AddSink 按批接收会话结果。完整样板见如何运行案例 SQL。
# 📚 相关文档
- 如何运行案例 SQL
- SQL 参考 —— SessionWindow 语法
- IoT 温度告警与指标聚合 —— 其它窗口模式
在 GitHub 上编辑此页 (opens new window)
上次更新: 2026/07/11, 04:40:00