在時序數(shù)據(jù)分析中,窗口查詢是一種強大的技術(shù),它可以將連續(xù)的時序數(shù)據(jù)按特定規(guī)則劃分為多個窗口,然后對每個窗口內(nèi)的數(shù)據(jù)進行聚合計算。TDengine時序數(shù)據(jù)庫提供了豐富的窗口查詢功能,本文將詳細介紹各種窗口類型及其應(yīng)用場景。
一、窗口查詢概述
1.1 什么是窗口查詢
窗口查詢允許針對查詢的數(shù)據(jù)集合按照窗口進行切分,并對每個窗口內(nèi)的數(shù)據(jù)進行聚合。這種查詢方式特別適用于需要對大量時間序列數(shù)據(jù)進行分析的場景。
例如,智能電表每10秒采集一次數(shù)據(jù),但需要查詢每隔1分鐘的溫度平均值,這時就需要使用窗口查詢。
1.2 窗口類型一覽
TDengine支持五種窗口類型:
| 窗口類型 | 說明 | 適用場景 |
|---|---|---|
| 時間窗口 | 根據(jù)時間間隔劃分數(shù)據(jù) | 固定周期聚合分析 |
| 狀態(tài)窗口 | 基于設(shè)備狀態(tài)值變化劃分 | 設(shè)備狀態(tài)監(jiān)控 |
| 會話窗口 | 根據(jù)時間戳差異劃分 | 用戶行為分析 |
| 事件窗口 | 基于事件條件動態(tài)劃分 | 事件驅(qū)動分析 |
| 計數(shù)窗口 | 根據(jù)數(shù)據(jù)行數(shù)劃分 | 固定樣本量分析 |
二、時間窗口
2.1 時間窗口語法
INTERVAL(interval_val [, interval_offset])
[SLIDING (sliding_val)]
[FILL(fill_mod_and_val)]
時間窗口子句包括三個部分:
- INTERVAL子句:指定每個時間窗口的大小和偏移量
- SLIDING子句:指定窗口向前滑動的時間
- FILL子句:指定窗口區(qū)間數(shù)據(jù)缺失時的填充模式
2.2 時間單位表示
時間間隔支持三種表示方式:
-- 帶時間單位的形式
INTERVAL(1s, 500a) SLIDING(1s)
-- 不帶時間單位的形式(使用數(shù)據(jù)庫精度)
INTERVAL(1000, 500) SLIDING(1000)
-- 帶時間單位的字符串形式
INTERVAL('1s', '500a') SLIDING('1s')
時間單位說明:
- a:毫秒
- b:納秒
- d:天
- h:小時
- m:分鐘
- n:月
- s:秒
- u:微秒
- w:周
- y:年
2.3 翻轉(zhuǎn)窗口示例
當SLIDING與INTERVAL相等時,即為翻轉(zhuǎn)窗口:
SELECT tbname, _wstart, _wend, avg(voltage)
FROM meters
WHERE ts >= "2022-01-01T00:00:00+08:00"
AND ts < "2022-01-01T00:05:00+08:00"
PARTITION BY tbname
INTERVAL(1m) SLIDING(1m)
SLIMIT 1;
查詢結(jié)果:
tbname | _wstart | _wend | avg(voltage) |
======================================================================================
d2 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:00.000 | 246.000000000000000 |
d2 | 2022-01-01 00:01:00.000 | 2022-01-01 00:02:00.000 | 240.833333333333343 |
d2 | 2022-01-01 00:02:00.000 | 2022-01-01 00:03:00.000 | 243.833333333333343 |
d2 | 2022-01-01 00:03:00.000 | 2022-01-01 00:04:00.000 | 241.333333333333343 |
d2 | 2022-01-01 00:04:00.000 | 2022-01-01 00:05:00.000 | 244.166666666666657 |
2.4 滑動窗口示例
滑動窗口允許窗口之間有重疊:
SELECT tbname, _wstart, avg(voltage)
FROM meters
WHERE ts >= "2022-01-01T00:00:00+08:00"
AND ts < "2022-01-01T00:05:00+08:00"
PARTITION BY tbname
INTERVAL(1m) SLIDING(30s)
SLIMIT 1;
查詢結(jié)果:
tbname | _wstart | avg(voltage) |
=============================================================
d2 | 2021-12-31 23:59:30.000 | 248.333333333333343 |
d2 | 2022-01-01 00:00:00.000 | 246.000000000000000 |
d2 | 2022-01-01 00:00:30.000 | 244.666666666666657 |
d2 | 2022-01-01 00:01:00.000 | 240.833333333333343 |
2.5 FILL子句
FILL子句用于指定窗口區(qū)間數(shù)據(jù)缺失時的填充模式:
- NONE:不進行填充(默認)
- VALUE:固定值填充,如
FILL(VALUE, 1.23) - NULL:填充NULL值
- PREV:填充前一個窗口的值
- NEXT:填充下一個窗口的值
- LINEAR:線性插值填充
三、時間戳偽列
在窗口聚合查詢結(jié)果中,可以使用時間戳偽列輸出窗口的時間信息:
| 偽列 | 說明 |
|---|---|
| _wstart | 時間窗口起始時間 |
| _wend | 時間窗口結(jié)束時間 |
| _wduration | 時間窗口持續(xù)時間 |
| _qstart | 查詢窗口起始時間 |
| _qend | 查詢窗口結(jié)束時間 |
示例:
SELECT tbname, _wstart, _wend, _wduration, avg(voltage)
FROM meters
WHERE ts >= "2022-01-01T00:00:00+08:00"
AND ts < "2022-01-01T00:05:00+08:00"
PARTITION BY tbname
INTERVAL(1m, 5s)
SLIMIT 2;
四、狀態(tài)窗口
4.1 狀態(tài)窗口概念
狀態(tài)窗口基于設(shè)備狀態(tài)值的變化劃分窗口,相同狀態(tài)值的數(shù)據(jù)歸為一個窗口,狀態(tài)值改變時窗口關(guān)閉。
4.2 狀態(tài)窗口語法
STATE_WINDOW(col)
4.3 應(yīng)用場景
狀態(tài)窗口適用于設(shè)備狀態(tài)監(jiān)控場景,例如:
- 設(shè)備運行狀態(tài)變化分析
- 溫度區(qū)間統(tǒng)計
- 告警狀態(tài)持續(xù)時間分析
五、會話窗口
5.1 會話窗口概念
會話窗口根據(jù)記錄的時間戳差異劃分會話,時間戳間隔小于預(yù)設(shè)值的記錄屬于同一會話。
5.2 會話窗口語法
SESSION(ts_col, tol_val)
參數(shù)說明:
ts_col:時間戳列tol_val:時間間隔容忍值
5.3 應(yīng)用場景
會話窗口適用于用戶行為分析場景,例如:
- 用戶會話分析
- 設(shè)備活躍時段統(tǒng)計
- 連續(xù)事件分析
六、事件窗口
6.1 事件窗口概念
事件窗口基于事件的開始條件和結(jié)束條件動態(tài)劃分窗口,滿足開始條件時窗口開啟,滿足結(jié)束條件時窗口關(guān)閉。
6.2 事件窗口語法
EVENT_WINDOW START WITH start_trigger_condition END WITH end_trigger_condition
6.3 應(yīng)用場景
事件窗口適用于事件驅(qū)動分析場景,例如:
- 溫度超過閾值的事件分析
- 設(shè)備異常時段統(tǒng)計
- 特定條件觸發(fā)的事件追蹤
七、計數(shù)窗口
7.1 計數(shù)窗口概念
計數(shù)窗口根據(jù)數(shù)據(jù)行數(shù)劃分窗口,每達到指定行數(shù)即為一個窗口,并進行聚合計算。
7.2 計數(shù)窗口語法
COUNT_WINDOW(count_val[, sliding_val])
參數(shù)說明:
count_val:每個窗口的數(shù)據(jù)行數(shù)sliding_val:窗口滑動的行數(shù)(可選)
7.3 應(yīng)用場景
計數(shù)窗口適用于固定樣本量分析場景,例如:
- 每100條數(shù)據(jù)計算一次統(tǒng)計值
- 固定樣本量的滑動分析
八、窗口查詢規(guī)則
在使用窗口子句時應(yīng)注意以下規(guī)則:
- 位置要求:窗口子句位于數(shù)據(jù)切分子句之后,不可以和GROUP BY子句一起使用
- SELECT限制:窗口子句將數(shù)據(jù)按窗口進行切分,SELECT列表中的表達式只能包含:
- 常量
- 偽列:_wstart、_wend、_wduration
- 聚合函數(shù)
- WHERE配合:WHERE語句可以指定查詢的起止時間和其他過濾條件
- 時區(qū)配置:使用INTERVAL語句時,建議把客戶端和服務(wù)端的timezone參數(shù)配置為相同的取值
九、窗口查詢最佳實踐
9.1 選擇合適的窗口類型
| 分析需求 | 推薦窗口類型 |
|---|---|
| 固定周期統(tǒng)計 | 時間窗口 |
| 狀態(tài)變化分析 | 狀態(tài)窗口 |
| 用戶會話分析 | 會話窗口 |
| 事件驅(qū)動分析 | 事件窗口 |
| 固定樣本分析 | 計數(shù)窗口 |
9.2 性能優(yōu)化建議
- 合理設(shè)置窗口大小,避免過小窗口導(dǎo)致大量計算
- 使用PARTITION BY配合窗口查詢,提高并行度
- 結(jié)合時間范圍條件,減少數(shù)據(jù)處理量
9.3 常見問題處理
- 數(shù)據(jù)缺失:使用FILL子句填充缺失值
- 窗口重疊:理解滑動窗口與翻轉(zhuǎn)窗口的區(qū)別
- 時區(qū)問題:確??蛻舳撕头?wù)端時區(qū)配置一致
總結(jié)
窗口查詢是時序數(shù)據(jù)分析的核心技術(shù)之一,TDengine時序數(shù)據(jù)庫提供了五種窗口類型,覆蓋了從固定周期統(tǒng)計到事件驅(qū)動分析的多種場景。通過合理使用窗口查詢,開發(fā)者可以高效地對時序數(shù)據(jù)進行降采樣、趨勢分析和異常檢測。時間窗口的翻轉(zhuǎn)和滑動模式、狀態(tài)窗口的狀態(tài)追蹤、會話窗口的連續(xù)性分析,這些功能為工業(yè)數(shù)據(jù)管理平臺(IDMP)和實時數(shù)據(jù)庫應(yīng)用提供了強大的數(shù)據(jù)分析能力。TDengine憑借其豐富的窗口查詢功能,成為物聯(lián)網(wǎng)和工業(yè)場景時序數(shù)據(jù)分析的理想選擇。



互聯(lián)網(wǎng).png)



-1.png)










伙伴.png)
伙伴.png)
伙伴.png)



