Update Queries-ch.md

Minor modifications on multi tables aggregation queries.
This commit is contained in:
Bo Xiao 2020-10-09 14:18:23 +08:00 committed by GitHub
parent 6875321877
commit 1ff9ddfcb2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 40 additions and 21 deletions

View File

@ -29,30 +29,49 @@ Query OK, 2 row(s) in set (0.001100s)
具体的查询语法请看<a href="https://www.taosdata.com/cn/documentation20/taos-sql/">TAOS SQL </a>
## 多表聚合查询
以温度传感器采集时序数据作为例示范Stable超级表多表聚合查询的使用。
TDengine对每个数据采集点单独建表但在实际应用中经常需要对不同的采集点数据进行聚合。为高效的进行聚合操作TDengine引入超级表STable的概念。超级表用来代表一特定类型的数据采集点它是包含多张表的表集合集合里每张表的模式schema完全一致但每张表都带有自己的静态标签标签可以多个可以随时增加、删除和修改。
应用可通过指定标签的过滤条件对一个STable下的全部或部分表进行聚合或统计操作这样大大简化应用的开发。其具体流程如下图所示
<center> <img src="../assets/stable.png"> </center>
<center> 多表聚合查询原理图 </center>
1应用将一个查询条件发往系统2: taosc将超级表的名字发往 Meta Node管理节点)3管理节点将超级表所拥有的 vnode 列表发回 taosc4taosc将计算的请求连同标签过滤条件发往这些vnode对应的多个数据节点5每个vnode先在内存里查找出自己节点里符合标签过滤条件的表的集合然后扫描存储的时序数据完成相应的聚合计算将结果返回给taosc6taosc将多个数据节点返回的结果做最后的聚合将其返回给应用。
由于TDengine在vnode内将标签数据与时序数据分离存储通过先在内存里过滤标签数据将需要扫描的数据集大幅减少大幅提升聚合计算速度。同时由于数据分布在多个vnode/dnode聚合计算操作在多个vnode里并发进行又进一步提升了聚合的速度。
对普通表的聚合函数以及绝大部分操作都适用于超级表,语法完全一样,细节请看 TAOS SQL。
比如在TAOS Shell查找所有智能电表采集的电压平均值并按照location分组
在这个例子中对每个温度计都会建立一张表表名为温度计的ID温度计读数的时刻记为ts采集的值记为degree。通过tags给每个采集器打上不同的标签其中记录温度计的地区和类型以方便我们后面的查询。所有温度计的采集量都一样因此我们用STable来定义表结构。
**定义STable表结构并使用它创建子表**
创建STable语句如下
```mysql
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)
CREATE TABLE thermometer (ts timestamp, degree double)
TAGS(location binary(20), type int)
```
假设有北京天津和上海三个地区的采集器共4个温度采集器有3种类型我们就可以对每个采集器建表如下
```mysql
CREATE TABLE therm1 USING thermometer TAGS (beijing, 1);
CREATE TABLE therm2 USING thermometer TAGS (beijing, 2);
CREATE TABLE therm3 USING thermometer TAGS (tianjin, 1);
CREATE TABLE therm4 USING thermometer TAGS (shanghai, 3);
```
其中therm1therm2therm3therm4是超级表thermometer四个具体的子表也即普通的Table。以therm1为例它表示采集器therm1的数据表结构完全由thermometer定义标签location=”beijing”, type=1表示therm1的地区是北京类型是第1类的温度计。
**写入数据**
注意写入数据时不能直接对STable操作而是要对每张子表进行操作。我们分别向四张表therm1therm2 therm3 therm4写入一条数据写入语句如下
```mysql
INSERT INTO therm1 VALUES (2018-01-01 00:00:00.000, 20);
INSERT INTO therm2 VALUES (2018-01-01 00:00:00.000, 21);
INSERT INTO therm3 VALUES (2018-01-01 00:00:00.000, 24);
INSERT INTO therm4 VALUES (2018-01-01 00:00:00.000, 23);
```
**按标签聚合查询**
查询位于北京(beijing)地区的型号为1的温度传感器采样值的数量count(*)、平均温度avg(degree)、最高温度max(degree)、最低温度min(degree),并将结果按所处地域(location)和传感器类型(type)进行聚合。
```mysql
SELECT COUNT(*), AVG(degree), MAX(degree), MIN(degree)
FROM thermometer
WHERE location=beijing and type = 1
GROUP BY location
```
**按时间周期聚合查询**
查询仅位于北京以外地区的温度传感器最近24小时(24h)采样值的数量count(*)、平均温度avg(degree)、最高温度max(degree)和最低温度min(degree)将采集结果按照10分钟为周期进行聚合并将结果按所处地域(location)和传感器类型(type)再次进行聚合。
```mysql
SELECT COUNT(*), AVG(degree), MAX(degree), MIN(degree)
FROM thermometer
WHERE name<>beijing and ts>=now-1d
INTERVAL(10M)
GROUP BY location, type
```
## 降采样查询、插值