小 T 導(dǎo)讀:作為一款專業(yè)的時序數(shù)據(jù)庫(Time Series Database,TSDB),為滿足用戶在不同場景下的查詢需求,TDengine 提供了豐富的查詢功能。除了一些主要的查詢外,還包括多表聚合查詢、降采樣查詢及連續(xù)查詢,本文將從實際操作層面對這三種特殊查詢進(jìn)行解讀。
查詢數(shù)據(jù)
主要查詢功能
TDengine 采用 SQL 作為查詢語言,應(yīng)用程序可以通過 REST API 或連接器發(fā)送 SQL 語句,用戶還可以通過 TDengine 命令行工具 taos 手動執(zhí)行 SQL 即席查詢(Ad-Hoc Query)。TDengine 支持如下查詢功能:
- 單列、多列數(shù)據(jù)查詢
- 標(biāo)簽和數(shù)值的多種過濾條件:>, <, =, <>, like 等
- 聚合結(jié)果的分組(Group by)、排序(Order by)、約束輸出(Limit/Offset)
- 數(shù)值列及聚合結(jié)果的四則運(yùn)算
- 時間戳對齊的連接查詢(Join Query: 隱式連接)操作
- 多種聚合/計算函數(shù): count, max, min, avg, sum, twa, stddev, leastsquares, top, bottom, first, last, percentile, apercentile, last_row, spread, diff 等
例如:在命令行工具 taos 中,我們需要從表 d1001 中查詢出 voltage > 215 的記錄,按時間降序排列,僅僅輸出如下 2 條結(jié)果。
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)
為滿足物聯(lián)網(wǎng)場景的需求,TDengine 還支持幾個特殊的函數(shù),比如 twa(時間加權(quán)平均)、spread (最大值與最小值的差)、last_row(最后一條記錄)等,未來還將有更多與物聯(lián)網(wǎng)場景相關(guān)的函數(shù)添加進(jìn)來。
多表聚合查詢
在物聯(lián)網(wǎng)場景中,往往同一個類型的數(shù)據(jù)采集點(diǎn)有多個。TDengine 采用超級表(STable)的概念來描述某一個類型的數(shù)據(jù)采集點(diǎn),一張普通的表來描述一個具體的數(shù)據(jù)采集點(diǎn)。同時 TDengine 使用標(biāo)簽來描述數(shù)據(jù)采集點(diǎn)的靜態(tài)屬性,一個具體的數(shù)據(jù)采集點(diǎn)有具體的標(biāo)簽值。
通過指定標(biāo)簽的過濾條件,TDengine 實現(xiàn)了將超級表(某一類型的數(shù)據(jù)采集點(diǎn))所屬的子表統(tǒng)一進(jìn)行聚合查詢。值得一提的是,對普通表的聚合函數(shù)以及絕大部分操作都適用于超級表,語法完全一樣。
- 示例一
在 TAOS Shell 查找加利福尼亞州所有智能電表采集的電壓平均值,并按照 location 分組。代碼如下所示:
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 的所有智能電表過去 24 小時的記錄條數(shù),電流的最大值。代碼如下所示:
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)
需要注意的是,TDengine 僅容許對同屬于一個超級表的表之間進(jìn)行聚合查詢,不同超級表之間的聚合查詢并不支持。
降采樣查詢、插值
除了上述場景,在物聯(lián)網(wǎng)場景中,我們還經(jīng)常需要通過降采樣(down sampling)將采集的數(shù)據(jù)按時間段進(jìn)行聚合。TDengine 提供了一個簡便的關(guān)鍵詞——interval(等間隔窗口),讓按照時間窗口進(jìn)行的查詢操作變得極為簡單。比如,對智能電表 d1001 采集的電流值按每 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)
同樣,降采樣操作也適用于超級表,比如將加利福尼亞州所有智能電表采集的電流值按每秒鐘求和:
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)
此外,降采樣操作也支持時間偏移,比如:將所有智能電表采集的電流值按每秒鐘求和,但要求每個時間窗口從 500 毫秒開始:
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)
眾所周知,在物聯(lián)網(wǎng)場景里每個數(shù)據(jù)采集點(diǎn)采集數(shù)據(jù)的時間較難同步,但很多分析算法(比如 FFT)需要把采集的數(shù)據(jù)嚴(yán)格按照時間等間隔地對齊,在很多系統(tǒng)里,這需要應(yīng)用自己寫程序來處理,但使用 TDengine 的降采樣操作這個需求便能輕松解決了。
如果一個時間間隔里沒有采集的數(shù)據(jù),TDengine 還提供插值計算的功能。
寫在最后
時序數(shù)據(jù)的查詢場景多種多樣,從用戶需求出發(fā),TDengine 進(jìn)行了一系列查詢功能的設(shè)計和優(yōu)化。本文詳細(xì)介紹了 TDengine 中的幾種復(fù)雜查詢功能,如果大家在實操中遇到問題,可以將本文當(dāng)做執(zhí)行手冊進(jìn)行查閱,對于還無法解決的問題,還可以加小 T 微信,進(jìn)入 TDengine 技術(shù)社區(qū)深入交流。



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



-1.png)







證.png)


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



