行业资讯
TDengine 窗口完整语法 — INTERVAL/SESSION/STATE/EVENT/COUNT 详解
分类10.SQL 参考 |篇章05 窗口完整语法适用版本TDengine v3.xv3.3.x / v3.4.x | 最后更新2026-07-18窗口子句是 TDengine 最具特色的语法。本文按窗口类型逐一详解语法、参数、约束、典型使用模式。窗口语法速查类型语法INTERVALINTERVAL(duration [, offset]) [SLIDING(duration)]SESSIONSESSION(ts_column, gap)STATESTATE_WINDOW(state_column)EVENTEVENT_WINDOW START WITH expr END WITH exprCOUNTCOUNT_WINDOW(count [, sliding_count])FILLFILL(NULL详细解析1. INTERVAL 完整语法INTERVAL(duration[,offset])[SLIDING(duration)][FILL(...)]-- duration: 窗口时长支持 b/u/a/s/m/h/d/w/n/y-- offset: 起始偏移用于非自然对齐-- SLIDING: 滑动步长必须 ≤ INTERVAL-- 示例INTERVAL(1m)-- 每分钟INTERVAL(1h)-- 每小时00:00 对齐INTERVAL(1d)-- 每天00:00 当地时间INTERVAL(1d,8h)-- 每天但从 08:00 开始INTERVAL(1h)SLIDING(15m)-- 1 小时窗口每 15 分钟一个INTERVAL(5m)SLIDING(1m)-- 5 分钟窗口每分钟产出-- 时间单位-- b: 纳秒 (ns)-- u: 微秒 (us)-- a: 毫秒 (ms)-- s: 秒-- m: 分钟-- h: 小时-- d: 天-- w: 周-- n: 月-- y: 年2. SESSION 窗口SESSION(ts_column,gap)-- ts_column: 时间列通常 ts-- gap: 会话切分阈值-- 示例SESSION(ts,30m)-- 30 分钟无数据切分SESSION(ts,1h)-- 1 小时切分-- 用法SELECT_wstart,_wend,COUNT(*),MAX(value)FROMeventsSESSION(ts,30m);-- 行为-- 相邻两行 ts 差 gap → 切分新窗口-- 数据稀疏时窗口少密集时窗口多3. STATE 窗口STATE_WINDOW(state_column)-- state_column: 状态列整数或字符串-- 示例SELECT_wstart,_wend,status,COUNT(*)FROMmachine_log STATE_WINDOW(status);-- 行为-- state_column 值变化 → 切分窗口-- 同一值连续行合并为一个窗口-- 约束-- state_column 不能是 TIMESTAMP/FLOAT-- 必须是 INT 或 VARCHAR/NCHAR4. EVENT 窗口EVENT_WINDOWSTARTWITHexpressionENDWITHexpression-- expression: 任意布尔表达式基于行数据-- 示例SELECT_wstart,_wend,MAX(temperature)FROMsensor EVENT_WINDOWSTARTWITHtemperature80ENDWITHtemperature60;-- 行为-- 满足 START 条件 → 窗口开始-- 满足 END 条件 → 窗口结束-- 期间所有行属于该窗口-- 注意-- 同一行可能同时满足 START 和 END-- 不在窗口期内的数据被忽略5. COUNT 窗口COUNT_WINDOW(count[,sliding_count])-- count: 窗口大小行数-- sliding_count: 滑动行数可选-- 示例COUNT_WINDOW(100)-- 每 100 行一个窗口COUNT_WINDOW(100,50)-- 滑动 50 行-- 行为-- 累积 count 行后输出窗口-- 不依赖时间按行数-- 适合等量采样6. FILL 选项-- 仅 INTERVAL/SESSION 等时间相关窗口支持INTERVAL(1h)FILL(fill_mode)-- fill_mode:FILL(NULL)-- 空窗口为 NULLFILL(VALUE,0)-- 空窗口为指定值FILL(VALUE,0,1)-- 多列分别指定FILL(PREV)-- 复用前值FILL(NEXT)-- 用后值FILL(LINEAR)-- 线性插值FILL(NONE)-- 跳过空窗口默认-- 示例SELECT_wstart,AVG(current)FROMmetersWHEREtsnow-1hINTERVAL(1m)FILL(LINEAR);-- LINEAR 需要前后非空窗口-- 头部/尾部空窗口可能退化为 PREV/NEXT 行为7. PARTITION BY 窗口-- 最常见组合每子表各自窗口聚合SELECTtbname,_wstart,AVG(current)FROMmetersPARTITIONBYtbnameINTERVAL(1h);-- 多列分区SELECTlocation,groupid,_wstart,AVG(current)FROMmetersPARTITIONBYlocation,groupidINTERVAL(1h);-- 行为-- 每个 partition 独立窗口聚合-- 输出每个 (partition, _wstart) 一行8. 窗口元数据列SELECT_wstart,-- 窗口开始时间_wend,-- 窗口结束时间_wduration,-- 窗口时长毫秒_qstart,-- 查询时间范围开始_qend,-- 查询时间范围结束COUNT(*)FROMmetersWHEREtsBETWEEN2026-06-01AND2026-06-02INTERVAL(1h);-- 输出示例-- _wstart _wend _wduration _qstart _qend count-- 2026-06-01 00:00:00 2026-06-01 01:00:00 3600000 2026-06-01 00:00:00 2026-06-02 00:00:00 100-- ...代码示例综合应用-- 设备小时级监控含填充SELECTtbname,_wstartAShour,AVG(current)ASavg_c,MAX(current)ASmax_c,COUNT(*)ASsamplesFROMmetersWHEREtsBETWEEN2026-06-01AND2026-06-08ANDlocationIN(Beijing,Shanghai)PARTITIONBYtbnameINTERVAL(1h)FILL(LINEAR);-- 用户会话分析SELECTuser_id,_wstartASsession_start,_wendASsession_end,_wduration/1000ASduration_sec,COUNT(*)ASactionsFROMuser_actionPARTITIONBYuser_idSESSION(ts,30m);-- 设备状态切换SELECTtbname,_wstartASstate_start,_wendASstate_end,status,_wdurationASdurationFROMmachine_logPARTITIONBYtbname STATE_WINDOW(status);-- 异常温度事件SELECTtbname,_wstart,_wend,MAX(temperature)ASpeak,COUNT(*)ASsamplesFROMsensorWHEREtsnow-7dPARTITIONBYtbname EVENT_WINDOWSTARTWITHtemperature80ENDWITHtemperature60;-- 滑动统计SELECT_wstart,AVG(current)ASrolling_avg,MAX(current)ASrolling_maxFROMmetersWHEREtsnow-1hINTERVAL(15m)SLIDING(1m)FILL(NULL);-- 等量采样SELECT_wstart,_wend,AVG(value),COUNT(*)FROMdata_streamPARTITIONBYtbname COUNT_WINDOW(1000);性能考量各窗口性能特点窗口状态量输出量复杂度INTERVAL中等高O(N)INTERVALSLIDING高极高O(N×slide_factor)SESSION低低O(N)STATE极低中O(N)EVENT极低低O(N)COUNT极低中O(N)选择建议业务推荐窗口时间报表INTERVAL趋势监控INTERVAL SLIDING用户会话SESSION设备状态时长STATE异常事件EVENT等量采样COUNTFAQQ1: SLIDING 必须 ≤ INTERVAL是。否则数据会跳过未被覆盖。Q2: 窗口必须配合 PARTITION BY 吗不必。无 PARTITION 时所有数据合并按窗口聚合。Q3: FILL 对头部/尾部空窗口效果LINEAR 需要前后非空窗口边界情况退化为 NULL 或 PREV/NEXT 行为。Q4: 嵌套窗口支持吗不直接支持。需用子查询先小窗口聚合再大窗口聚合。Q5: 一个查询能用多个窗口吗不能。一个查询只能一种窗口类型。需要时用子查询分步。参考系统构架篇01-《TDengine 整体架构全景》02-《集群拓扑深度解析》03-《MNode 内部机制深度解析》04-《RPC 通信层深度解析》05-《VNode 生命周期》06-《RAFT 共识协议》07-《端到端的消息流》数据模型01-《数据库创建与参数详解》02-《超级表/子表/普通表》03-《支持数据类型深度解析》04-《TDengine Tag 设计哲学与 Schema 变更机制》05-《TDengine 虚拟表实现原理》存储引擎01-《TDengine 存储引擎概览》02-《TDengine MemTable 深度解析》03-《TDengine WAL 预写日志机制》04-《TDengine 数据文件格式》05-《TDengine Commit 与 Flush 机制 》06-《TDengine Compaction 合并策略 》07-《TDengine 数据保留与 TTL》08-《TDengine 压缩编码机制》09-《TDengine Cache 与 Last 查询加速》10-《TDengine 逻辑计划生成》查询引擎01-《TDengine 查询引擎概览》02-《TDengine SQL 解析与词法分析》03-《TDengine 语义分析与 AST 重写》04-《TDengine 逻辑计划生成》05-《TDengine 物理计划生成》06-《TDengine 扫描算子》07-《TDengine 聚合算子》08-《TDengine 连接算子》09-《TDengine 排序、填充与投影》10-《TDengine 分布式查询执行》11-《TDengine EXPLAIN 与查询优化》数据写入01-《TDengine SQL INSERT》02-《TDengine 无模式写入》03-《TDengine STMT 写入》04-《TDengine 写入内部流程》05-《TDengine 数据更新删除》数据订阅01-《TDengine 数据订阅》02-《TDengine 订阅 vs Kafka》03-《TDengine TMQ 消费流程》04-《TDengine 内部机制》05-《TDengine TMQ 最佳实践》预聚合01-《TDengine RSMA》02-《TDengine TSMA — 时间维度的物化聚合视图》03-《TDengine SMA 内部实现》索引01-《TDengine Tag 索引》02-《TDengine SMA 索引》SQL 语句01-《TDengine DDL》02-《TDengine DML SELECT》03-《TDengine DML 函数完整参考》关于 TDengineTDengine 专为物联网IoT平台、工业大数据平台设计。其中TDengine TSDB 是一款高性能、分布式的时序数据库Time Series Database同时它还带有内建的缓存、流式计算、数据订阅等系统功能TDengine IDMP 是一款AI原生工业数据管理平台它通过树状层次结构建立数据目录对数据进行标准化、情景化并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
郑州网站建设
网页设计
企业官网