小 T 導讀:作為一款專業的時序數據庫(Time Series Database,TSDB),為滿足用(yong)戶在不(bu)同(tong)場景(jing)下(xia)的查(cha)(cha)詢(xun)需求,TDengine 提供了豐富的查(cha)(cha)詢(xun)功能。除(chu)了一(yi)些主要的查(cha)(cha)詢(xun)外,還(huan)包(bao)括多(duo)表(biao)聚合查(cha)(cha)詢(xun)、降采樣查(cha)(cha)詢(xun)及連(lian)續(xu)查(cha)(cha)詢(xun),本文將從實際操作層面對這三種特殊查(cha)(cha)詢(xun)進行(xing)解(jie)讀。
查詢數據
主要查詢功能
TDengine 采用 SQL 作為查詢(xun)語言,應(ying)用程(cheng)序可以(yi)通(tong)過(guo)(guo) REST API 或連接器發(fa)送 SQL 語句,用戶還可以(yi)通(tong)過(guo)(guo) TDengine 命令(ling)行工具 taos 手(shou)動執行 SQL 即席查詢(xun)(Ad-Hoc Query)。TDengine 支持如下查詢(xun)功能:
- 單列、多列數據查詢
- 標簽和數值的多種過濾條件:>, <, =, <>, like 等
- 聚合結果的分組(Group by)、排序(Order by)、約束輸出(Limit/Offset)
- 數值列及聚合結果的四則運算
- 時間戳對齊的連接查詢(Join Query: 隱式連接)操作
- 多種聚合/計算函數: count, max, min, avg, sum, twa, stddev, leastsquares, top, bottom, first, last, percentile, apercentile, last_row, spread, diff 等
例如:在命令行工具 taos 中(zhong),我們(men)需(xu)要從表 d1001 中(zhong)查詢出 voltage > 215 的記錄,按時間降序(xu)排列,僅僅輸出如下 2 條結果。
taos> select * from d1001 where voltage > 215 order by ts desc limit 2;
ts | current | voltage | phase |
======================================================================================
2018-10-03 14:38:16.800 | 12.30000 | 221 | 0.31000 |
2018-10-03 14:38:15.000 | 12.60000 | 218 | 0.33000 |
Query OK, 2 row(s) in set (0.001100s)
為滿(man)足物聯網場(chang)(chang)景的(de)需求,TDengine 還(huan)支(zhi)持幾個特殊的(de)函數(shu)(shu),比如 twa(時(shi)間加權平均)、spread (最(zui)大值(zhi)與最(zui)小值(zhi)的(de)差(cha))、last_row(最(zui)后一條(tiao)記錄)等,未(wei)來還(huan)將有更多與物聯網場(chang)(chang)景相關的(de)函數(shu)(shu)添加進來。
多表聚合查詢
在物聯網(wang)場景中,往往同一個類型(xing)的數據(ju)采(cai)(cai)集(ji)點(dian)有(you)多個。TDengine 采(cai)(cai)用(yong)超級表(biao)(STable)的概念來(lai)描述(shu)某一個類型(xing)的數據(ju)采(cai)(cai)集(ji)點(dian),一張普通的表(biao)來(lai)描述(shu)一個具體(ti)的數據(ju)采(cai)(cai)集(ji)點(dian)。同時 TDengine 使用(yong)標簽來(lai)描述(shu)數據(ju)采(cai)(cai)集(ji)點(dian)的靜(jing)態(tai)屬(shu)性,一個具體(ti)的數據(ju)采(cai)(cai)集(ji)點(dian)有(you)具體(ti)的標簽值。
通過指(zhi)定標簽(qian)的(de)(de)過濾條件,TDengine 實(shi)現了將超級表(biao)(某一(yi)(yi)類型的(de)(de)數(shu)據采集點)所屬的(de)(de)子(zi)表(biao)統(tong)一(yi)(yi)進行(xing)聚合(he)(he)查詢。值得一(yi)(yi)提(ti)的(de)(de)是,對(dui)普通表(biao)的(de)(de)聚合(he)(he)函數(shu)以及(ji)絕大部(bu)分(fen)操作都適用于超級表(biao),語(yu)法(fa)完全一(yi)(yi)樣。
- 示例一
在 TAOS Shell 查(cha)找加利福尼(ni)亞州所有智能電表采集的電壓平均(jun)值(zhi),并按照 location 分(fen)組。代碼如下所示:
taos> SELECT AVG(voltage) FROM meters GROUP BY location;
avg(voltage) | location |
=============================================================
222.000000000 | California.LosAngeles |
219.200000000 | California.SanFrancisco |
Query OK, 2 row(s) in set (0.002136s)
- 示例二
在 TAOS shell 查找 groupId 為 2 的(de)所(suo)有智(zhi)能電表過(guo)去 24 小時的(de)記錄條數(shu),電流的(de)最大值。代碼如(ru)下所(suo)示:
taos> SELECT count(*), max(current) FROM meters where groupId = 2 and ts > now - 24h;
cunt(*) | max(current) |
==================================
5 | 13.4 |
Query OK, 1 row(s) in set (0.002136s)
需要注意的(de)(de)是,TDengine 僅容許對同(tong)屬于(yu)一個超級表(biao)的(de)(de)表(biao)之間進行聚合查詢,不同(tong)超級表(biao)之間的(de)(de)聚合查詢并(bing)不支持。
降采樣查詢、插值
除了(le)上述場(chang)景(jing),在物(wu)聯(lian)網場(chang)景(jing)中,我們還(huan)經(jing)常需要(yao)通過降采(cai)樣(down sampling)將(jiang)采(cai)集的(de)數據按時間(jian)段(duan)進(jin)行聚合(he)。TDengine 提供了(le)一個簡便的(de)關鍵詞——interval(等間(jian)隔窗口),讓按照時間(jian)窗口進(jin)行的(de)查詢操作變得(de)極為簡單。比如(ru),對(dui)智能電表 d1001 采(cai)集的(de)電流(liu)值(zhi)按每 10 秒鐘求和:
taos> SELECT sum(current) FROM d1001 INTERVAL(10s);
ts | sum(current) |
======================================================
2018-10-03 14:38:00.000 | 10.300000191 |
2018-10-03 14:38:10.000 | 24.900000572 |
Query OK, 2 row(s) in set (0.000883s)
同樣,降采樣操作也適(shi)用于超級表(biao),比(bi)如(ru)將(jiang)加利(li)福(fu)尼亞州所有智能電(dian)表(biao)采集的電(dian)流值按每秒鐘求(qiu)和:
taos> SELECT SUM(current) FROM meters where location like "California%" INTERVAL(1s);
ts | sum(current) |
======================================================
2018-10-03 14:38:04.000 | 10.199999809 |
2018-10-03 14:38:05.000 | 32.900000572 |
2018-10-03 14:38:06.000 | 11.500000000 |
2018-10-03 14:38:15.000 | 12.600000381 |
2018-10-03 14:38:16.000 | 36.000000000 |
Query OK, 5 row(s) in set (0.001538s)
此外,降采樣操作也支持(chi)時間偏移,比如:將所有智能電表采集(ji)的電流值按每(mei)秒(miao)鐘求和,但要求每(mei)個時間窗口從(cong) 500 毫(hao)秒(miao)開始(shi):
taos> SELECT SUM(current) FROM meters INTERVAL(1s, 500a);
ts | sum(current) |
======================================================
2018-10-03 14:38:04.500 | 11.189999809 |
2018-10-03 14:38:05.500 | 31.900000572 |
2018-10-03 14:38:06.500 | 11.600000000 |
2018-10-03 14:38:15.500 | 12.300000381 |
2018-10-03 14:38:16.500 | 35.000000000 |
Query OK, 5 row(s) in set (0.001521s)
眾所周知,在物聯網場景里每(mei)個數據(ju)(ju)采(cai)集點采(cai)集數據(ju)(ju)的時間(jian)(jian)(jian)較難同步,但很多分(fen)析(xi)算法(比(bi)如(ru) FFT)需要把(ba)采(cai)集的數據(ju)(ju)嚴格按(an)照(zhao)時間(jian)(jian)(jian)等間(jian)(jian)(jian)隔地對齊,在很多系(xi)統(tong)里,這需要應用自己寫程序來(lai)處理,但使用 TDengine 的降采(cai)樣(yang)操(cao)作這個需求便能輕松解決(jue)了。
如果(guo)一個時間間隔里(li)沒有采集(ji)的數據,TDengine 還提(ti)供插值計(ji)算(suan)的功能。
寫在最后
時(shi)序(xu)數據的(de)查(cha)詢(xun)場(chang)景(jing)多(duo)種多(duo)樣,從用戶需求出發,TDengine 進行(xing)了(le)一系(xi)列查(cha)詢(xun)功能的(de)設計(ji)和優化。本文(wen)詳細介紹了(le) TDengine 中的(de)幾種復(fu)雜查(cha)詢(xun)功能,如果大家在實(shi)操中遇到問題(ti),可以將本文(wen)當做執(zhi)行(xing)手冊進行(xing)查(cha)閱(yue),對于還無法解決(jue)的(de)問題(ti),還可以加小 T 微信,進入(ru) TDengine 技術社區深入(ru)交流。


























