高效查詢數據
主要查詢功能
TDengine 采用 SQL 作為(wei)查詢(xun)語言(yan)。應用程序(xu)可以通(tong)過 C/C++, Java, Go, C#, Python, Node.js 連接器發送 SQL 語句,用戶(hu)可以通(tong)過 TDengine 提供的命令行(Command Line Interface, CLI)工(gong)具(ju) TAOS Shell 手動執行 SQL 即席查詢(xun)(Ad-Hoc Query)。TDengine 支持(chi)如下查詢(xun)功能(neng):
- 單列、多列數據查詢
- 標簽和數值的多種過濾條件:>, <, =, <>, 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等
例(li)如:在TAOS Shell中,從表d1001中查詢出(chu)voltage > 215的記錄,按時(shi)間降序排列,僅僅輸出(chu)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)
為(wei)滿足物聯網場景(jing)(jing)的(de)需(xu)求,TDengine支持幾個(ge)特殊(shu)的(de)函數,比如twa(時間加(jia)權(quan)平(ping)均),spread (最(zui)大值與最(zui)小值的(de)差(cha)),last_row(最(zui)后一條記錄)等,更多與物聯網場景(jing)(jing)相關(guan)的(de)函數將添加(jia)進來。TDengine還支持連續查詢。
具體的查詢語法請看 TAOS SQL 的數據查詢 章節。
多表聚合查詢
物聯(lian)網場景中,往往同一(yi)(yi)個(ge)類(lei)型的(de)數據采(cai)(cai)集點有(you)多個(ge)。TDengine采(cai)(cai)用超級(ji)(ji)(ji)表(biao)(STable)的(de)概念來(lai)(lai)描(miao)(miao)述某一(yi)(yi)個(ge)類(lei)型的(de)數據采(cai)(cai)集點,一(yi)(yi)張普通(tong)的(de)表(biao)來(lai)(lai)描(miao)(miao)述一(yi)(yi)個(ge)具體(ti)(ti)的(de)數據采(cai)(cai)集點。同時TDengine使用標簽來(lai)(lai)描(miao)(miao)述數據采(cai)(cai)集點的(de)靜態屬(shu)(shu)性,一(yi)(yi)個(ge)具體(ti)(ti)的(de)數據采(cai)(cai)集點有(you)具體(ti)(ti)的(de)標簽值。通(tong)過(guo)指定標簽的(de)過(guo)濾條件,TDengine提供了一(yi)(yi)高(gao)效的(de)方法將超級(ji)(ji)(ji)表(biao)(某一(yi)(yi)類(lei)型的(de)數據采(cai)(cai)集點)所屬(shu)(shu)的(de)子(zi)表(biao)進行聚合(he)查詢。對普通(tong)表(biao)的(de)聚合(he)函數以(yi)及絕大部分操作都(dou)適用于超級(ji)(ji)(ji)表(biao),語法完全一(yi)(yi)樣。
示例1:在TAOS Shell,查找北京所有智能電(dian)表采(cai)集(ji)的電(dian)壓平(ping)均值(zhi),并按照location分組
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, 查找(zhao)groupId為2的所(suo)有智能電(dian)表過(guo)去24小(xiao)時的記錄條(tiao)數,電(dian)流的最(zui)大值
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僅容許對屬于同一個超級表的表之間進行聚合查詢,不同超級表之間的聚合查詢不支持。在 TAOS SQL 的數據查詢 一章,查詢(xun)類操作(zuo)都會注明是否支(zhi)持超級表。
降采樣查詢、插值
物聯網場景(jing)里(li),經(jing)常需要通過降采(cai)樣(down sampling)將采(cai)集的數據按(an)時間段進行聚(ju)合。TDengine 提(ti)供(gong)了一個簡便(bian)的關鍵詞 interval 讓(rang)按(an)照時間窗口的查(cha)詢操作變得極為簡單。比如,將智能電表 d1001 采(cai)集的電流值每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)
降采(cai)(cai)樣(yang)操作也(ye)適用(yong)于超級(ji)表,比如:將北京所有(you)智能電表采(cai)(cai)集的電流值每(mei)秒鐘求和
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)
降采樣操作也(ye)支持時(shi)(shi)間(jian)偏(pian)移,比如:將所有智(zhi)能電表采集的電流值(zhi)每(mei)秒鐘求和,但要求每(mei)個時(shi)(shi)間(jian)窗口從(cong) 500 毫(hao)秒開始
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)
物(wu)聯網場景里,每個數(shu)(shu)據采(cai)集點采(cai)集數(shu)(shu)據的(de)(de)(de)時間(jian)是難同步的(de)(de)(de),但很多分析算法(比(bi)如(ru)FFT)需要把(ba)采(cai)集的(de)(de)(de)數(shu)(shu)據嚴格(ge)按照時間(jian)等間(jian)隔的(de)(de)(de)對齊,在很多系統(tong)里,需要應用(yong)自己寫程序來處(chu)理,但使用(yong)TDengine的(de)(de)(de)降采(cai)樣(yang)操作就(jiu)輕松解(jie)決。如(ru)果一個時間(jian)間(jian)隔里,沒(mei)有采(cai)集的(de)(de)(de)數(shu)(shu)據,TDengine還提(ti)供插值計(ji)算的(de)(de)(de)功能。
語法規則細節請見 TAOS SQL 的時間維度聚合 章節。

