高效查詢(xún)數(shù)據(jù)
主要查詢(xún)功能
TDengine 采用 SQL 作為查詢(xún)語(yǔ)言。應(yīng)用程序可以通過(guò) C/C++, Java, Go, C#, Python, Node.js 連接器發(fā)送 SQL 語(yǔ)句,用戶(hù)可以通過(guò) TDengine 提供的命令行(Command Line Interface, CLI)工具 TAOS Shell 手動(dòng)執(zhí)行 SQL 即席查詢(xún)(Ad-Hoc Query)。TDengine 支持如下查詢(xún)功能:
- 單列、多列數(shù)據(jù)查詢(xún)
- 標(biāo)簽和數(shù)值的多種過(guò)濾條件:>, <, =, <>, like 等
- 聚合結(jié)果的分組(Group by)、排序(Order by)、約束輸出(Limit/Offset)
- 數(shù)值列及聚合結(jié)果的四則運(yùn)算
- 時(shí)間戳對(duì)齊的連接查詢(xún)(Join Query: 隱式連接)操作
- 多種聚合/計(jì)算函數(shù): count, max, min, avg, sum, twa, stddev, leastsquares, top, bottom, first, last, percentile, apercentile, last_row, spread, diff等
例如:在TAOS Shell中,從表d1001中查詢(xún)出voltage > 215的記錄,按時(shí)間降序排列,僅僅輸出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)
為滿足物聯(lián)網(wǎng)場(chǎng)景的需求,TDengine支持幾個(gè)特殊的函數(shù),比如twa(時(shí)間加權(quán)平均),spread (最大值與最小值的差),last_row(最后一條記錄)等,更多與物聯(lián)網(wǎng)場(chǎng)景相關(guān)的函數(shù)將添加進(jìn)來(lái)。TDengine還支持連續(xù)查詢(xún)。
具體的查詢(xún)語(yǔ)法請(qǐng)看 TAOS SQL 的數(shù)據(jù)查詢(xún) 章節(jié)。
多表聚合查詢(xún)
物聯(lián)網(wǎng)場(chǎng)景中,往往同一個(gè)類(lèi)型的數(shù)據(jù)采集點(diǎn)有多個(gè)。TDengine采用超級(jí)表(STable)的概念來(lái)描述某一個(gè)類(lèi)型的數(shù)據(jù)采集點(diǎn),一張普通的表來(lái)描述一個(gè)具體的數(shù)據(jù)采集點(diǎn)。同時(shí)TDengine使用標(biāo)簽來(lái)描述數(shù)據(jù)采集點(diǎn)的靜態(tài)屬性,一個(gè)具體的數(shù)據(jù)采集點(diǎn)有具體的標(biāo)簽值。通過(guò)指定標(biāo)簽的過(guò)濾條件,TDengine提供了一高效的方法將超級(jí)表(某一類(lèi)型的數(shù)據(jù)采集點(diǎn))所屬的子表進(jìn)行聚合查詢(xún)。對(duì)普通表的聚合函數(shù)以及絕大部分操作都適用于超級(jí)表,語(yǔ)法完全一樣。
示例1:在TAOS Shell,查找北京所有智能電表采集的電壓平均值,并按照l(shuí)ocation分組
taos> SELECT AVG(voltage) FROM meters GROUP BY location;
avg(voltage) | location |
=============================================================
222.000000000 | Beijing.Haidian |
219.200000000 | Beijing.Chaoyang |
Query OK, 2 row(s) in set (0.002136s)
示例2:在TAOS shell, 查找groupId為2的所有智能電表過(guò)去24小時(shí)的記錄條數(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僅容許對(duì)屬于同一個(gè)超級(jí)表的表之間進(jìn)行聚合查詢(xún),不同超級(jí)表之間的聚合查詢(xún)不支持。在 TAOS SQL 的數(shù)據(jù)查詢(xún) 一章,查詢(xún)類(lèi)操作都會(huì)注明是否支持超級(jí)表。
降采樣查詢(xún)、插值
物聯(lián)網(wǎng)場(chǎng)景里,經(jīng)常需要通過(guò)降采樣(down sampling)將采集的數(shù)據(jù)按時(shí)間段進(jìn)行聚合。TDengine 提供了一個(gè)簡(jiǎn)便的關(guān)鍵詞 interval 讓按照時(shí)間窗口的查詢(xún)操作變得極為簡(jiǎ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)
降采樣操作也適用于超級(jí)表,比如:將北京所有智能電表采集的電流值每秒鐘求和
taos> SELECT SUM(current) FROM meters where location like "Beijing%" 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)
降采樣操作也支持時(shí)間偏移,比如:將所有智能電表采集的電流值每秒鐘求和,但要求每個(gè)時(shí)間窗口從 500 毫秒開(kāi)始
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)場(chǎng)景里,每個(gè)數(shù)據(jù)采集點(diǎn)采集數(shù)據(jù)的時(shí)間是難同步的,但很多分析算法(比如FFT)需要把采集的數(shù)據(jù)嚴(yán)格按照時(shí)間等間隔的對(duì)齊,在很多系統(tǒng)里,需要應(yīng)用自己寫(xiě)程序來(lái)處理,但使用TDengine的降采樣操作就輕松解決。如果一個(gè)時(shí)間間隔里,沒(méi)有采集的數(shù)據(jù),TDengine還提供插值計(jì)算的功能。
語(yǔ)法規(guī)則細(xì)節(jié)請(qǐng)見(jiàn) TAOS SQL 的時(shí)間維度聚合 章節(jié)。
支持和反饋
感謝您成為我們社區(qū)的一員!歡迎您對(duì)本文檔或其他任何 TDengine 錯(cuò)誤進(jìn)行修改或報(bào)告。

