数据操作语言(DML)
数据写入
IoTDB为用户提供多种插入实时数据的方式,例如在Cli/Shell工具中直接输入插入数据的INSERT语句,或使用Java API(标准Java JDBC接口)单条或批量执行插入数据的INSERT语句。
本节主要为您介绍实时数据接入的INSERT语句在场景中的实际使用示例,有关INSERT SQL语句的详细语法请参见本文INSERT语句节。
使用INSERT语句
使用INSERT语句可以向指定的已经创建的一条或多条时间序列中插入数据。对于每一条数据,均由一个时间戳类型的时间戳和一个数值或布尔值、字符串类型的传感器采集值组成。
在本节的场景实例下,以其中的两个时间序列root.ln.wf02.wt02.status和root.ln.wf02.wt02.hardware为例 ,它们的数据类型分别为BOOLEAN和TEXT。
单列数据插入示例代码如下:
1. IoTDB > insert into root.ln.wf02.wt02(timestamp,status) values(1,true)
2. IoTDB > insert into root.ln.wf02.wt02(timestamp,hardware) values(1, "v1")
以上示例代码将长整型的timestamp以及值为true的数据插入到时间序列root.ln.wf02.wt02.status中和将长整型的timestamp以及值为”v1”的数据插入到时间序列root.ln.wf02.wt02.hardware中。执行成功后会返回执行时间,代表数据插入已完成。
注意:在IoTDB中,TEXT类型的数据单双引号都可以来表示,上面的插入语句是用的是双引号表示TEXT类型数据,下面的示例将使用单引号表示TEXT类型数据。
INSERT语句还可以支持在同一个时间点下多列数据的插入,同时向2时间点插入上述两个时间序列的值,多列数据插入示例代码如下:
1. IoTDB > insert into root.ln.wf02.wt02(timestamp, status, hardware) VALUES (2, false, 'v2')
插入数据后我们可以使用SELECT语句简单查询已插入的数据。
1. IoTDB > select * from root.ln.wf02 where time < 3
结果如图所示。由查询结果可以看出,单列、多列数据的插入操作正确执行。
1. +-----------------------------+--------------------------+------------------------+
2. | Time|root.ln.wf02.wt02.hardware|root.ln.wf02.wt02.status|
3. +-----------------------------+--------------------------+------------------------+
4. |1970-01-01T08:00:00.001+08:00| v1| true|
5. |1970-01-01T08:00:00.002+08:00| v2| false|
6. +-----------------------------+--------------------------+------------------------+
7. Total line number = 2
8. It costs 0.170s
数据查询
时间条件过滤查询
本节主要介绍时间切片查询的相关示例,主要使用的是IoTDB SELECT语句。同时,您也可以使用Java JDBC标准接口来执行相关的查询语句。
- 根据一个时间区间选择一列数据
SQL语句为:
1. select temperature from root.ln.wf01.wt01 where time < 2017-11-01T00:08:00.000
其含义为:
被选择的设备为ln集团wf01子站wt01设备;被选择的时间序列为温度传感器(temperature);该语句要求选择出该设备在“2017-11-01T00:08:00.000”(此处可以使用多种时间格式,详情可参看2.1节)时间点以前的所有温度传感器的值。
该SQL语句的执行结果如下:
1. +-----------------------------+-----------------------------+
2. | Time|root.ln.wf01.wt01.temperature|
3. +-----------------------------+-----------------------------+
4. |2017-11-01T00:00:00.000+08:00| 25.96|
5. |2017-11-01T00:01:00.000+08:00| 24.36|
6. |2017-11-01T00:02:00.000+08:00| 20.09|
7. |2017-11-01T00:03:00.000+08:00| 20.18|
8. |2017-11-01T00:04:00.000+08:00| 21.13|
9. |2017-11-01T00:05:00.000+08:00| 22.72|
10. |2017-11-01T00:06:00.000+08:00| 20.71|
11. |2017-11-01T00:07:00.000+08:00| 21.45|
12. +-----------------------------+-----------------------------+
13. Total line number = 8
14. It costs 0.026s
- 根据一个时间区间选择多列数据
SQL语句为:
1. select status, temperature from root.ln.wf01.wt01 where time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000;
其含义为:
被选择的设备为ln集团wf01子站wt01设备;被选择的时间序列为供电状态(status)和温度传感器(temperature);该语句要求选择出“2017-11-01T00:05:00.000”至“2017-11-01T00:12:00.000”之间的所选时间序列的值。
该SQL语句的执行结果如下:
1. +-----------------------------+------------------------+-----------------------------+
2. | Time|root.ln.wf01.wt01.status|root.ln.wf01.wt01.temperature|
3. +-----------------------------+------------------------+-----------------------------+
4. |2017-11-01T00:06:00.000+08:00| false| 20.71|
5. |2017-11-01T00:07:00.000+08:00| false| 21.45|
6. |2017-11-01T00:08:00.000+08:00| false| 22.58|
7. |2017-11-01T00:09:00.000+08:00| false| 20.98|
8. |2017-11-01T00:10:00.000+08:00| true| 25.52|
9. |2017-11-01T00:11:00.000+08:00| false| 22.91|
10. +-----------------------------+------------------------+-----------------------------+
11. Total line number = 6
12. It costs 0.018s
- 按照多个时间区间选择同一设备的多列数据
IoTDB支持在一次查询中指定多个时间区间条件,用户可以根据需求随意组合时间区间条件。例如,
SQL语句为:
1. select status,temperature from root.ln.wf01.wt01 where (time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000) or (time >= 2017-11-01T16:35:00.000 and time <= 2017-11-01T16:37:00.000);
其含义为:
被选择的设备为ln集团wf01子站wt01设备;被选择的时间序列为“供电状态(status)”和“温度传感器(temperature)”;该语句指定了两个不同的时间区间,分别为“2017-11-01T00:05:00.000至2017-11-01T00:12:00.000”和“2017-11-01T16:35:00.000至2017-11-01T16:37:00.000”;该语句要求选择出满足任一时间区间的被选时间序列的值。
该SQL语句的执行结果如下:
1. +-----------------------------+------------------------+-----------------------------+
2. | Time|root.ln.wf01.wt01.status|root.ln.wf01.wt01.temperature|
3. +-----------------------------+------------------------+-----------------------------+
4. |2017-11-01T00:06:00.000+08:00| false| 20.71|
5. |2017-11-01T00:07:00.000+08:00| false| 21.45|
6. |2017-11-01T00:08:00.000+08:00| false| 22.58|
7. |2017-11-01T00:09:00.000+08:00| false| 20.98|
8. |2017-11-01T00:10:00.000+08:00| true| 25.52|
9. |2017-11-01T00:11:00.000+08:00| false| 22.91|
10. |2017-11-01T16:35:00.000+08:00| true| 23.44|
11. |2017-11-01T16:36:00.000+08:00| false| 21.98|
12. |2017-11-01T16:37:00.000+08:00| false| 21.93|
13. +-----------------------------+------------------------+-----------------------------+
14. Total line number = 9
15. It costs 0.018s
- 按照多个时间区间选择不同设备的多列数据
该系统支持在一次查询中选择任意列的数据,也就是说,被选择的列可以来源于不同的设备。例如,SQL语句为:
1. select wf01.wt01.status,wf02.wt02.hardware from root.ln where (time > 2017-11-01T00:05:00.000 and time < 2017-11-01T00:12:00.000) or (time >= 2017-11-01T16:35:00.000 and time <= 2017-11-01T16:37:00.000);
其含义为:
被选择的时间序列为“ln集团wf01子站wt01设备的供电状态”以及“ln集团wf02子站wt02设备的硬件版本”;该语句指定了两个时间区间,分别为“2017-11-01T00:05:00.000至2017-11-01T00:12:00.000”和“2017-11-01T16:35:00.000至2017-11-01T16:37:00.000”;该语句要求选择出满足任意时间区间的被选时间序列的值。
该SQL语句的执行结果如下:
1. +-----------------------------+------------------------+--------------------------+
2. | Time|root.ln.wf01.wt01.status|root.ln.wf02.wt02.hardware|
3. +-----------------------------+------------------------+--------------------------+
4. |2017-11-01T00:06:00.000+08:00| false| v1|
5. |2017-11-01T00:07:00.000+08:00| false| v1|
6. |2017-11-01T00:08:00.000+08:00| false| v1|
7. |2017-11-01T00:09:00.000+08:00| false| v1|
8. |2017-11-01T00:10:00.000+08:00| true| v2|
9. |2017-11-01T00:11:00.000+08:00| false| v1|
10. |2017-11-01T16:35:00.000+08:00| true| v2|
11. |2017-11-01T16:36:00.000+08:00| false| v1|
12. |2017-11-01T16:37:00.000+08:00| false| v1|
13. +-----------------------------+------------------------+--------------------------+
14. Total line number = 9
15. It costs 0.014s
其他结果对齐方式
- 根据时间降序返回 IoTDB 在 0.11 版本开始支持 ‘order by time’ 语句, 用于对结果按照时间进行降序展示。例如,SQL语句为:
1. select * from root.ln where time > 1 order by time desc limit 10;
语句执行的结果为:
1. +-----------------------------+--------------------------+------------------------+-----------------------------+------------------------+
2. | Time|root.ln.wf02.wt02.hardware|root.ln.wf02.wt02.status|root.ln.wf01.wt01.temperature|root.ln.wf01.wt01.status|
3. +-----------------------------+--------------------------+------------------------+-----------------------------+------------------------+
4. |2017-11-07T23:59:00.000+08:00| v1| false| 21.07| false|
5. |2017-11-07T23:58:00.000+08:00| v1| false| 22.93| false|
6. |2017-11-07T23:57:00.000+08:00| v2| true| 24.39| true|
7. |2017-11-07T23:56:00.000+08:00| v2| true| 24.44| true|
8. |2017-11-07T23:55:00.000+08:00| v2| true| 25.9| true|
9. |2017-11-07T23:54:00.000+08:00| v1| false| 22.52| false|
10. |2017-11-07T23:53:00.000+08:00| v2| true| 24.58| true|
11. |2017-11-07T23:52:00.000+08:00| v1| false| 20.18| false|
12. |2017-11-07T23:51:00.000+08:00| v1| false| 22.24| false|
13. |2017-11-07T23:50:00.000+08:00| v2| true| 23.7| true|
14. +-----------------------------+--------------------------+------------------------+-----------------------------+------------------------+
15. Total line number = 10
16. It costs 0.016s
更多语法请参照 SQL REFERENCE.
- IoTDB支持另外两种结果返回形式: 按设备时间对齐 ‘align by device’ 和 时序不对齐 ‘disable align’.
‘align by device’ 对齐方式下,设备ID会单独作为一列出现。在 select 子句中写了多少列,最终结果就会有该列数+2 (时间列和设备名字列)。SQL形如:
1. select * from root.ln.* where time <= 2017-11-01T00:01:00 align by device
结果如下:
1. +-----------------------------+-----------------+-----------+------+--------+
2. | Time| Device|temperature|status|hardware|
3. +-----------------------------+-----------------+-----------+------+--------+
4. |2017-11-01T00:00:00.000+08:00|root.ln.wf01.wt01| 25.96| true| null|
5. |2017-11-01T00:01:00.000+08:00|root.ln.wf01.wt01| 24.36| true| null|
6. |1970-01-01T08:00:00.001+08:00|root.ln.wf02.wt02| null| true| v1|
7. |1970-01-01T08:00:00.002+08:00|root.ln.wf02.wt02| null| false| v2|
8. |2017-11-01T00:00:00.000+08:00|root.ln.wf02.wt02| null| true| v2|
9. |2017-11-01T00:01:00.000+08:00|root.ln.wf02.wt02| null| true| v2|
10. +-----------------------------+-----------------+-----------+------+--------+
11. Total line number = 6
12. It costs 0.012s
‘disable align’ 意味着每条时序就有 2 列存在。Disable Align只能用于查询语句句尾,不能用于聚合查询、Fill语句、Group by或Group by device语句,但可用于Limit语句。结果显示若无数据显示为空白。
SQL形如:
1. select * from root.ln.* where time <= 2017-11-01T00:01:00 disable align
结果如下:
1. +-----------------------------+--------------------------+-----------------------------+------------------------+-----------------------------+-----------------------------+-----------------------------+------------------------+
2. | Time|root.ln.wf02.wt02.hardware| Time|root.ln.wf02.wt02.status| Time|root.ln.wf01.wt01.temperature| Time|root.ln.wf01.wt01.status|
3. +-----------------------------+--------------------------+-----------------------------+------------------------+-----------------------------+-----------------------------+-----------------------------+------------------------+
4. |1970-01-01T08:00:00.001+08:00| v1|1970-01-01T08:00:00.001+08:00| true|2017-11-01T00:00:00.000+08:00| 25.96|2017-11-01T00:00:00.000+08:00| true|
5. |1970-01-01T08:00:00.002+08:00| v2|1970-01-01T08:00:00.002+08:00| false|2017-11-01T00:01:00.000+08:00| 24.36|2017-11-01T00:01:00.000+08:00| true|
6. |2017-11-01T00:00:00.000+08:00| v2|2017-11-01T00:00:00.000+08:00| true| null| null| null| null|
7. |2017-11-01T00:01:00.000+08:00| v2|2017-11-01T00:01:00.000+08:00| true| null| null| null| null|
8. +-----------------------------+--------------------------+-----------------------------+------------------------+-----------------------------+-----------------------------+-----------------------------+------------------------+
9. Total line number = 4
10. It costs 0.018s
更多语法请参照SQL REFERENCE。
结果空值过滤
- 如果结果集中,任意一列为null,则过滤掉该行;即获得的结果集不包含任何空值
1. select * from root.ln.* where time <= 2017-11-01T00:01:00 WITHOUT NULL ANY
- 在降采样查询中,如果结果集的某一行所有列都为null,则过滤掉该行;即获得的结果集不包含所有值都为null的行
1. select * from root.ln.* where time <= 2017-11-01T00:01:00 WITHOUT NULL ALL
聚合函数
本章节主要介绍聚合查询的相关示例, 主要使用的是IoTDB SELECT语句的聚合查询函数。
- 统计总点数
1. select count(status) from root.ln.wf01.wt01;
结果:
1. +-------------------------------+
2. |count(root.ln.wf01.wt01.status)|
3. +-------------------------------+
4. | 10080|
5. +-------------------------------+
6. Total line number = 1
7. It costs 0.016s
时间区间分组聚合
本章节主要介绍时间区间分组聚合查询的相关示例, 主要使用的是IoTDB SELECT语句的GROUP BY子句, 该子句是IoTDB中用于根据用户给定划分条件对结果集进行划分,并对已划分的结果集进行聚合计算的语句。 IoTDB支持根据时间间隔和自定义的滑动步长(默认值与时间间隔相同,自定义的值必须大于等于时间间隔)对结果集进行划分,默认结果按照时间升序排列。 同时,您也可以使用Java JDBC标准接口来执行相关的查询语句。
GROUP BY语句为用户提供三类指定参数:
- 参数1:时间轴显示时间窗参数
- 参数2:划分时间轴的时间间隔参数(必须为正数)
- 参数3:滑动步长(可选参数,默认值与时间间隔相同,自定义的值必须大于等于时间间隔)
三类参数的实际含义已经在下图中指出,这三类参数里,第三个参数是可选的。 接下来,我们将给出三种典型的降频聚合查询的例子: 滑动步长未指定, 指定滑动步长, 带值过滤条件。

- 未指定滑动步长的降频聚合查询
对应的SQL语句是:
1. select count(status), max_value(temperature) from root.ln.wf01.wt01 group by ([2017-11-01T00:00:00, 2017-11-07T23:00:00),1d);
这条查询的含义是:
由于用户没有指定滑动步长,滑动步长将会被默认设置为跟时间间隔参数相同,也就是1d。
上面这个例子的第一个参数是显示窗口参数,决定了最终的显示范围是[2017-11-01T00:00:00, 2017-11-07T23:00:00)。
上面这个例子的第二个参数是划分时间轴的时间间隔参数,将1d当作划分间隔,显示窗口参数的起始时间当作分割原点,时间轴即被划分为连续的时间间隔:[0,1d), [1d, 2d), [2d, 3d)等等。
然后系统将会用WHERE子句中的时间和值过滤条件以及GROUP BY语句中的第一个参数作为数据的联合过滤条件,获得满足所有过滤条件的数据(在这个例子里是在[2017-11-01T00:00:00, 2017-11-07 T23:00:00)这个时间范围的数据),并把这些数据映射到之前分割好的时间轴中(这个例子里是从2017-11-01T00:00:00到2017-11-07T23:00:00:00的每一天)
每个时间间隔窗口内都有数据,SQL执行后的结果集如下所示:
1. +-----------------------------+-------------------------------+----------------------------------------+
2. | Time|count(root.ln.wf01.wt01.status)|max_value(root.ln.wf01.wt01.temperature)|
3. +-----------------------------+-------------------------------+----------------------------------------+
4. |2017-11-01T00:00:00.000+08:00| 1440| 26.0|
5. |2017-11-02T00:00:00.000+08:00| 1440| 26.0|
6. |2017-11-03T00:00:00.000+08:00| 1440| 25.99|
7. |2017-11-04T00:00:00.000+08:00| 1440| 26.0|
8. |2017-11-05T00:00:00.000+08:00| 1440| 26.0|
9. |2017-11-06T00:00:00.000+08:00| 1440| 25.99|
10. |2017-11-07T00:00:00.000+08:00| 1380| 26.0|
11. +-----------------------------+-------------------------------+----------------------------------------+
12. Total line number = 7
13. It costs 0.024s
- 指定滑动步长的时间区间分组聚合查询
对应的SQL语句是:
1. select count(status), max_value(temperature) from root.ln.wf01.wt01 group by ([2017-11-01 00:00:00, 2017-11-07 23:00:00), 3h, 1d);
这条查询的含义是:
由于用户指定了滑动步长为1d,GROUP BY语句执行时将会每次把时间间隔往后移动一天的步长,而不是默认的3小时。
也就意味着,我们想要取从2017-11-01到2017-11-07每一天的凌晨0点到凌晨3点的数据。
上面这个例子的第一个参数是显示窗口参数,决定了最终的显示范围是[2017-11-01T00:00:00, 2017-11-07T23:00:00)。
上面这个例子的第二个参数是划分时间轴的时间间隔参数,将3h当作划分间隔,显示窗口参数的起始时间当作分割原点,时间轴即被划分为连续的时间间隔:[2017-11-01T00:00:00, 2017-11-01T03:00:00), [2017-11-02T00:00:00, 2017-11-02T03:00:00), [2017-11-03T00:00:00, 2017-11-03T03:00:00)等等。
上面这个例子的第三个参数是每次时间间隔的滑动步长。
然后系统将会用WHERE子句中的时间和值过滤条件以及GROUP BY语句中的第一个参数作为数据的联合过滤条件,获得满足所有过滤条件的数据(在这个例子里是在[2017-11-01T00:00:00, 2017-11-07 T23:00:00)这个时间范围的数据),并把这些数据映射到之前分割好的时间轴中(这个例子里是从2017-11-01T00:00:00到2017-11-07T23:00:00:00的每一天的凌晨0点到凌晨3点)
每个时间间隔窗口内都有数据,SQL执行后的结果集如下所示:
1. +-----------------------------+-------------------------------+----------------------------------------+
2. | Time|count(root.ln.wf01.wt01.status)|max_value(root.ln.wf01.wt01.temperature)|
3. +-----------------------------+-------------------------------+----------------------------------------+
4. |2017-11-01T00:00:00.000+08:00| 180| 25.98|
5. |2017-11-02T00:00:00.000+08:00| 180| 25.98|
6. |2017-11-03T00:00:00.000+08:00| 180| 25.96|
7. |2017-11-04T00:00:00.000+08:00| 180| 25.96|
8. |2017-11-05T00:00:00.000+08:00| 180| 26.0|
9. |2017-11-06T00:00:00.000+08:00| 180| 25.85|
10. |2017-11-07T00:00:00.000+08:00| 180| 25.99|
11. +-----------------------------+-------------------------------+----------------------------------------+
12. Total line number = 7
13. It costs 0.006s
- 按照自然月份的时间区间分组聚合查询
对应的SQL语句是:
1. select count(status) from root.ln.wf01.wt01 where time > 2017-11-01T01:00:00 group by([2017-11-01T00:00:00, 2019-11-07T23:00:00), 1mo, 2mo);
这条查询的含义是:
由于用户指定了滑动步长为2mo,GROUP BY语句执行时将会每次把时间间隔往后移动2个自然月的步长,而不是默认的1个自然月。
也就意味着,我们想要取从2017-11-01到2019-11-07每2个自然月的第一个月的数据。
上面这个例子的第一个参数是显示窗口参数,决定了最终的显示范围是[2017-11-01T00:00:00, 2019-11-07T23:00:00)。
起始时间为2017-11-01T00:00:00,滑动步长将会以起始时间作为标准按月递增,取当月的1号作为时间间隔的起始时间。
上面这个例子的第二个参数是划分时间轴的时间间隔参数,将1mo当作划分间隔,显示窗口参数的起始时间当作分割原点,时间轴即被划分为连续的时间间隔:[2017-11-01T00:00:00, 2017-12-01T00:00:00), [2018-02-01T00:00:00, 2018-03-01T00:00:00), [2018-05-03T00:00:00, 2018-06-01T00:00:00)等等。
上面这个例子的第三个参数是每次时间间隔的滑动步长。
然后系统将会用WHERE子句中的时间和值过滤条件以及GROUP BY语句中的第一个参数作为数据的联合过滤条件,获得满足所有过滤条件的数据(在这个例子里是在[2017-11-01T00:00:00, 2019-11-07T23:00:00)这个时间范围的数据),并把这些数据映射到之前分割好的时间轴中(这个例子里是从2017-11-01T00:00:00到2019-11-07T23:00:00:00的每两个自然月的第一个月)
每个时间间隔窗口内都有数据,SQL执行后的结果集如下所示:
1. +-----------------------------+-------------------------------+
2. | Time|count(root.ln.wf01.wt01.status)|
3. +-----------------------------+-------------------------------+
4. |2017-11-01T00:00:00.000+08:00| 259|
5. |2018-01-01T00:00:00.000+08:00| 250|
6. |2018-03-01T00:00:00.000+08:00| 259|
7. |2018-05-01T00:00:00.000+08:00| 251|
8. |2018-07-01T00:00:00.000+08:00| 242|
9. |2018-09-01T00:00:00.000+08:00| 225|
10. |2018-11-01T00:00:00.000+08:00| 216|
11. |2019-01-01T00:00:00.000+08:00| 207|
12. |2019-03-01T00:00:00.000+08:00| 216|
13. |2019-05-01T00:00:00.000+08:00| 207|
14. |2019-07-01T00:00:00.000+08:00| 199|
15. |2019-09-01T00:00:00.000+08:00| 181|
16. |2019-11-01T00:00:00.000+08:00| 60|
17. +-----------------------------+-------------------------------+
对应的SQL语句是:
1. select count(status) from root.ln.wf01.wt01 group by([2017-10-31T00:00:00, 2019-11-07T23:00:00), 1mo, 2mo);
这条查询的含义是:
由于用户指定了滑动步长为2mo,GROUP BY语句执行时将会每次把时间间隔往后移动2个自然月的步长,而不是默认的1个自然月。
也就意味着,我们想要取从2017-10-31到2019-11-07每2个自然月的第一个月的数据。
与上述示例不同的是起始时间为2017-10-31T00:00:00,滑动步长将会以起始时间作为标准按月递增,取当月的31号(即最后一天)作为时间间隔的起始时间。若起始时间设置为30号,滑动步长会将时间间隔的起始时间设置为当月30号,若不存在则为最后一天。
上面这个例子的第一个参数是显示窗口参数,决定了最终的显示范围是[2017-10-31T00:00:00, 2019-11-07T23:00:00)。
上面这个例子的第二个参数是划分时间轴的时间间隔参数,将1mo当作划分间隔,显示窗口参数的起始时间当作分割原点,时间轴即被划分为连续的时间间隔:[2017-10-31T00:00:00, 2017-11-31T00:00:00), [2018-02-31T00:00:00, 2018-03-31T00:00:00), [2018-05-31T00:00:00, 2018-06-31T00:00:00)等等。
上面这个例子的第三个参数是每次时间间隔的滑动步长。
然后系统将会用WHERE子句中的时间和值过滤条件以及GROUP BY语句中的第一个参数作为数据的联合过滤条件,获得满足所有过滤条件的数据(在这个例子里是在[2017-10-31T00:00:00, 2019-11-07T23:00:00)这个时间范围的数据),并把这些数据映射到之前分割好的时间轴中(这个例子里是从2017-10-31T00:00:00到2019-11-07T23:00:00:00的每两个自然月的第一个月)
每个时间间隔窗口内都有数据,SQL执行后的结果集如下所示:
1. +-----------------------------+-------------------------------+
2. | Time|count(root.ln.wf01.wt01.status)|
3. +-----------------------------+-------------------------------+
4. |2017-10-31T00:00:00.000+08:00| 251|
5. |2017-12-31T00:00:00.000+08:00| 250|
6. |2018-02-28T00:00:00.000+08:00| 259|
7. |2018-04-30T00:00:00.000+08:00| 250|
8. |2018-06-30T00:00:00.000+08:00| 242|
9. |2018-08-31T00:00:00.000+08:00| 225|
10. |2018-10-31T00:00:00.000+08:00| 216|
11. |2018-12-31T00:00:00.000+08:00| 208|
12. |2019-02-28T00:00:00.000+08:00| 216|
13. |2019-04-30T00:00:00.000+08:00| 208|
14. |2019-06-30T00:00:00.000+08:00| 199|
15. |2019-08-31T00:00:00.000+08:00| 181|
16. |2019-10-31T00:00:00.000+08:00| 69|
17. +-----------------------------+-------------------------------+
- 左开右闭区间
每个区间的结果时间戳为区间右端点,对应的SQL语句是:
1. select count(status) from root.ln.wf01.wt01 group by ((2017-11-01T00:00:00, 2017-11-07T23:00:00],1d);
这条查询语句的时间区间是左开右闭的,结果中不会包含时间点2017-11-01的数据,但是会包含时间点2017-11-07的数据。
SQL执行后的结果集如下所示:
1. +-----------------------------+-------------------------------+
2. | Time|count(root.ln.wf01.wt01.status)|
3. +-----------------------------+-------------------------------+
4. |2017-11-02T00:00:00.000+08:00| 1440|
5. |2017-11-03T00:00:00.000+08:00| 1440|
6. |2017-11-04T00:00:00.000+08:00| 1440|
7. |2017-11-05T00:00:00.000+08:00| 1440|
8. |2017-11-06T00:00:00.000+08:00| 1440|
9. |2017-11-07T00:00:00.000+08:00| 1440|
10. |2017-11-07T23:00:00.000+08:00| 1380|
11. +-----------------------------+-------------------------------+
12. Total line number = 7
13. It costs 0.004s
路径层级分组聚合
在时间序列层级结构中,分层聚合查询用于对某一层级进行聚合查询。 这里使用LEVEL来统计指定层级下的聚合范围,该语句约定root为第0层序列,若统计”root.ln”下所有序列则需指定level为1。
例如:在”root.ln.wf01”下存在多个子序列:wt01,wt02,wt03等均有名为status的序列, 如果需要统计这些子序列的status包含的点个数,使用以下查询:
1. select count(status) from root.ln.wf01.* group by level=2
运行结果为:
1. +----------------------------+
2. |count(root.ln.wf01.*.status)|
3. +----------------------------+
4. | 10080|
5. +----------------------------+
6. Total line number = 1
7. It costs 0.003s
假设此时添加两条序列,”root.ln.wf01.wt01.temperature” and “root.ln.wf02.wt01.temperature”。 需要同时查询”root.ln.*.*.temperature”在第二层级的count聚合结果和sum聚合结果,可以使用下列查询语句:
1. select count(temperature), sum(temperature) from root.ln.*.* group by level=2
运行结果:
1. +---------------------------------+---------------------------------+-------------------------------+-------------------------------+
2. |count(root.ln.wf02.*.temperature)|count(root.ln.wf01.*.temperature)|sum(root.ln.wf02.*.temperature)|sum(root.ln.wf01.*.temperature)|
3. +---------------------------------+---------------------------------+-------------------------------+-------------------------------+
4. | 8| 4| 228.0| 91.83000183105469|
5. +---------------------------------+---------------------------------+-------------------------------+-------------------------------+
6. Total line number = 1
7. It costs 0.013s
若统计”root.ln.*.*“下第一层级的count聚合结果和sum聚合结果,则设置level=1即可:
1. select count(temperature), sum(temperature) from root.ln.*.* group by level=1
运行结果:
1. +------------------------------+----------------------------+
2. |count(root.ln.*.*.temperature)|sum(root.ln.*.*.temperature)|
3. +------------------------------+----------------------------+
4. | 12| 319.8300018310547|
5. +------------------------------+----------------------------+
6. Total line number = 1
7. It costs 0.013s
分层聚合查询也可被用于其他聚合函数,当前所支持的聚合函数为:count, sum, avg, last_value, first_value, min_time, max_time, min_value, max_value, extreme
对于sum, avg, min_value, max_value, extreme五种聚合函数,需保证所有聚合的时间序列数据类型相同。其他聚合函数没有此限制。
时间区间和路径层级分组聚合查询
除此之外,还可以通过定义LEVEL来统计指定层级下的数据点个数。
例如:
统计降采样后的数据点个数
1. select count(status) from root.ln.wf01.wt01 group by ((2017-11-01T00:00:00, 2017-11-07T23:00:00],1d), level=1;
结果:
1. +-----------------------------+-------------------------+
2. | Time|COUNT(root.ln.*.*.status)|
3. +-----------------------------+-------------------------+
4. |2017-11-02T00:00:00.000+08:00| 1440|
5. |2017-11-03T00:00:00.000+08:00| 1440|
6. |2017-11-04T00:00:00.000+08:00| 1440|
7. |2017-11-05T00:00:00.000+08:00| 1440|
8. |2017-11-06T00:00:00.000+08:00| 1440|
9. |2017-11-07T00:00:00.000+08:00| 1440|
10. |2017-11-07T23:00:00.000+08:00| 1380|
11. +-----------------------------+-------------------------+
12. Total line number = 7
13. It costs 0.006s
加上滑动Step的降采样后的结果也可以汇总
1. select count(status) from root.ln.wf01.wt01 group by ([0,20),2ms,3ms), level=1;
1. +-----------------------------+-------------------------+
2. | Time|COUNT(root.ln.*.*.status)|
3. +-----------------------------+-------------------------+
4. |2017-11-01T00:00:00.000+08:00| 180|
5. |2017-11-02T00:00:00.000+08:00| 180|
6. |2017-11-03T00:00:00.000+08:00| 180|
7. |2017-11-04T00:00:00.000+08:00| 180|
8. |2017-11-05T00:00:00.000+08:00| 180|
9. |2017-11-06T00:00:00.000+08:00| 180|
10. |2017-11-07T00:00:00.000+08:00| 180|
11. +-----------------------------+-------------------------+
12. Total line number = 7
13. It costs 0.004s
最新点查询
SQL语法:
1. select last <Path> [COMMA <Path>]* from < PrefixPath > [COMMA < PrefixPath >]* <WhereClause>
其含义是:查询时间序列prefixPath.path中最近时间戳的数据
<WhereClause>中当前只支持含有’>’或’>=’的时间过滤条件,任何其他过滤条件都将会返回异常。
结果集为三列的结构
1. +----+----------+-----+----+
2. |Time|timeseries|value|type|
3. +----+----------+-----+----+
示例 1:查询 root.ln.wf01.wt01.status 的最新数据点
1. IoTDB> select last status from root.ln.wf01.wt01
2. +-----------------------------+------------------------+-----+-------+
3. | Time| timeseries|value| type|
4. +-----------------------------+------------------------+-----+-------+
5. |2017-11-07T23:59:00.000+08:00|root.ln.wf01.wt01.status|false|BOOLEAN|
6. +-----------------------------+------------------------+-----+-------+
7. Total line number = 1
8. It costs 0.000s
示例 2:查询 root.ln.wf01.wt01 下 status,temperature 时间戳大于等于2017-11-07T23:50:00的最新数据点。
1. IoTDB> select last status, temperature from root.ln.wf01.wt01 where time >= 2017-11-07T23:50:00
2. +-----------------------------+-----------------------------+---------+-------+
3. | Time| timeseries| value| type|
4. +-----------------------------+-----------------------------+---------+-------+
5. |2017-11-07T23:59:00.000+08:00| root.ln.wf01.wt01.status| false|BOOLEAN|
6. |2017-11-07T23:59:00.000+08:00|root.ln.wf01.wt01.temperature|21.067368| DOUBLE|
7. +-----------------------------+-----------------------------+---------+-------+
8. Total line number = 2
9. It costs 0.002s
模糊查询
模糊查询分为Like语句和Regexp语句,都可以支持对Text类型的数据进行模糊匹配
Like语句:
示例 1:查询 root.sg.device 下 value 含有'cc'的数据。 % 表示任意0个或多个字符。
1. IoTDB> select * from root.sg.device where value like '%cc%'
2. +-----------------------------+--------------------+
3. | Time|root.sg.device.value|
4. +-----------------------------+--------------------+
5. |2017-11-07T23:59:00.000+08:00| aabbccdd|
6. |2017-11-07T23:59:00.000+08:00| cc|
7. +-----------------------------+--------------------+
8. Total line number = 2
9. It costs 0.002s
示例 2:查询 root.sg.device 下 value 中间为 'b'、前后为任意单个字符的数据。 _ 表示任意单个字符。
1. IoTDB> select * from root.sg.device where value like '_b_'
2. +-----------------------------+--------------------+
3. | Time|root.sg.device.value|
4. +-----------------------------+--------------------+
5. |2017-11-07T23:59:00.000+08:00| abc|
6. +-----------------------------+--------------------+
7. Total line number = 1
8. It costs 0.002s
Regexp语句:
需要传入的过滤条件为 Java 标准库风格的正则表达式
示例 1:查询 root.sg.device 下 value 值为26个英文字符组成的字符串
1. IoTDB> select * from root.sg.device where value regexp '^[A-Za-z]+$'
2. +-----------------------------+--------------------+
3. | Time|root.sg.device.value|
4. +-----------------------------+--------------------+
5. |2017-11-07T23:59:00.000+08:00| aabbccdd|
6. |2017-11-07T23:59:00.000+08:00| cc|
7. +-----------------------------+--------------------+
8. Total line number = 2
9. It costs 0.002s
示例 2:查询 root.sg.device 下 value 值为26个小写英文字符组成的字符串 且时间大于100的
1. IoTDB> select * from root.sg.device where value regexp '^[a-z]+$' and time > 100
2. +-----------------------------+--------------------+
3. | Time|root.sg.device.value|
4. +-----------------------------+--------------------+
5. |2017-11-07T23:59:00.000+08:00| aabbccdd|
6. |2017-11-07T23:59:00.000+08:00| cc|
7. +-----------------------------+--------------------+
8. Total line number = 2
9. It costs 0.002s
常见的正则匹配举例:
1. 长度为3-20的所有字符:^.{3,20}$
2. 大写英文字符:^[A-Z]+$
3. 数字和英文字符:^[A-Za-z0-9]+$
4. 以a开头的:^a.*
更多语法请参照 SQL REFERENCE.
空值填充
在IoTDB的实际使用中,当进行时间序列的查询操作时,可能会出现在某些时间点值为null的情况,这会妨碍用户进行进一步的分析。 为了更好地反映数据更改的程度,用户希望可以自动填充缺失值。 因此,IoTDB系统引入了自动填充功能。
自动填充功能是指对单列或多列执行时间序列查询时,根据用户指定的方法和有效时间范围填充空值。 如果查询点的值不为null,则填充功能将不起作用。
注意:在当前版本中,IoTDB为用户提供两种方法:Previous 和Linear。 Previous 方法用前一个值填充空白。 Linear方法通过线性拟合来填充空白。 并且填充功能只能在执行时间点查询时使用。
- 填充功能
- Previous功能
当查询的时间戳值为空时,将使用前一个时间戳的值来填充空白。 形式化的先前方法如下(有关详细语法,请参见第7.1.3.6节):
1. select <path> from <prefixPath> where time = <T> fill(<data_type>[previous, <before_range>], …)
表3-4给出了所有参数的详细说明。
**表3-4previous填充参数列表**
| 参数名称(不区分大小写) | 解释 |
|---|---|
| path, prefixPath | 查询路径; 必填项 |
| T | 查询时间戳(只能指定一个); 必填项 |
| data_type | 填充方法使用的数据类型。 可选值是int32,int64,float,double,boolean,text; 可选字段 |
| before_range | 表示前一种方法的有效时间范围。 当[T-before _range,T]范围内的值存在时,前一种方法将起作用。 如果未指定before_range,则before_range会使用默认值default_fill_interval; -1表示无穷大; 可选字段 |
在这里,我们举一个使用先前方法填充空值的示例。 SQL语句如下:
1. select temperature from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float[previous, 1m])
意思是:
由于时间根目录root.sgcc.wf03.wt01.temperature在2017-11-01T16:37:50.000为空,因此系统使用以前的时间戳2017-11-01T16:37:00.000(且时间戳位于[2017-11-01T16:36:50.000, 2017-11-01T16:37:50.000]范围)进行填充和显示。
在样例数据中
(opens new window), 该语句的执行结果如下所示:
1. +-----------------------------+-------------------------------+
2. | Time|root.sgcc.wf03.wt01.temperature|
3. +-----------------------------+-------------------------------+
4. |2017-11-01T16:37:50.000+08:00| 21.93|
5. +-----------------------------+-------------------------------+
6. Total line number = 1
7. It costs 0.016s
值得注意的是,如果在指定的有效时间范围内没有值,系统将不会填充空值,如下所示:
1. IoTDB> select temperature from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float[previous, 1s])
2. +-----------------------------+-------------------------------+
3. | Time|root.sgcc.wf03.wt01.temperature|
4. +-----------------------------+-------------------------------+
5. |2017-11-01T16:37:50.000+08:00| null|
6. +-----------------------------+-------------------------------+
7. Total line number = 1
8. It costs 0.004s
- Linear方法
当查询的时间戳值为空时,将使用前一个和下一个时间戳的值来填充空白。 形式化线性方法如下:
1. select <path> from <prefixPath> where time = <T> fill(<data_type>[linear, <before_range>, <after_range>]…)
表3-5中给出了所有参数的详细说明。
**表3-5线性填充参数列表**
| 参数名称(不区分大小写) | 解释 |
|---|---|
| path, prefixPath | 查询路径; 必填项 |
| T | 查询时间戳(只能指定一个); 必填项 |
| data_type | 填充方法使用的数据类型。 可选值是int32,int64,float,double,boolean,text; 可选字段 |
| before_range, after_range | 表示线性方法的有效时间范围。 当[T-before_range,T + after_range]范围内的值存在时,前一种方法将起作用。 如果未明确指定before_range和after_range,则使用default_fill_interval。 -1表示无穷大; 可选字段 |
需要注意的是一旦时间序列在查询时间戳T时刻存在有效值,线性填充就会使用这个值作为结果返回。 除此之外,如果在[T-before_range,T]或[T, T + after_range]两个范围中任意一个范围内不存在有效填充值,则线性填充返回null值。
在这里,我们举一个使用线性方法填充空值的示例。 SQL语句如下:
1. select temperature from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float [linear, 1m, 1m])
意思是:
由于时间根目录root.sgcc.wf03.wt01.temperature在2017-11-01T16:37:50.000为空,因此系统使用以前的时间戳2017-11-01T16:37:00.000(且时间戳位于[2017-11-01T16:36:50.000, 2017-11-01T16:37:50.000]时间范围)及其值21.927326,下一个时间戳记2017-11-01T16:38:00.000(且时间戳记位于[2017-11-01T16:37:50.000, 2017-11-01T16:38:50.000]时间范围)及其值25.311783以执行线性拟合计算:
21.927326 +(25.311783-21.927326)/ 60s * 50s = 24.747707
在 样例数据
(opens new window), 该语句的执行结果如下所示:
1. +-----------------------------+-------------------------------+
2. | Time|root.sgcc.wf03.wt01.temperature|
3. +-----------------------------+-------------------------------+
4. |2017-11-01T16:37:50.000+08:00| 24.746666|
5. +-----------------------------+-------------------------------+
6. Total line number = 1
7. It costs 0.017s
- Value方法
当查询的时间戳值为空时,将使用给定的值来填充空白。 特定值填充方法如下:
1. select <path> from <prefixPath> where time = <T> fill(<data_type>[constant]…)
表3-6中给出了所有参数的详细说明。
**表3-6特定值填充参数列表**
| 参数名称(不区分大小写) | 解释 |
|---|---|
| path, prefixPath | 查询路径; 必填项 |
| T | 查询时间戳(只能指定一个); 必填项 |
| data_type | 填充方法使用的数据类型。 可选值是int32,int64,float,double,boolean,text; 可选字段 |
| constant | 给定的填充值 |
需要注意的是一旦时间序列在查询时间戳T时刻存在有效值,特定值填充就会使用这个值作为结果返回。
在这里,我们举一个使用特定值方法填充空值的示例。 SQL语句如下:
1. select temperature from root.sgcc.wf03.wt01 where time = 2017-11-01T16:37:50.000 fill(float [2.0])
意思是:
由于时间根目录root.sgcc.wf03.wt01.temperature在2017-11-01T16:37:50.000为空,因此使用给定的值2.0进行填充:
在 样例数据
(opens new window), 该语句的执行结果如下所示:
1. +-----------------------------+-------------------------------+
2. | Time|root.sgcc.wf03.wt01.temperature|
3. +-----------------------------+-------------------------------+
4. |2017-11-01T16:37:50.000+08:00| 2.0 |
5. +-----------------------------+-------------------------------+
6. Total line number = 1
7. It costs 0.007s
数据类型和填充方法之间的对应关系
数据类型和支持的填充方法如表3-6所示。
**表3-6数据类型和支持的填充方法**
| 数据类型 | 支持的填充方法 |
|---|---|
| boolean | previous, value |
| int32 | previous, linear, value |
| int64 | previous, linear, value |
| float | previous, linear, value |
| double | previous, linear, value |
| text | previous, value |
注意:应在Fill语句中至少指定一种填充方法。
- 时间区间分组聚合查询补空值
时间区间分组聚合出的各个时间段的结果,支持使用前值补空。
不允许设置滑动步长,默认为聚合时间区间,实际为定长采样。现在只支持 last_value 聚合函数。
目前不支持线性插值补空值。
PREVIOUS 和 PREVIOUSUNTILLAST 的区别
- PREVIOUS:只要空值前边有值,就会用其填充空值。
- PREVIOUSUNTILLAST:不会填充此序列最新点后的空值
首先我们检查一下root.ln.wf01.wt01.temperature在时间2017-11-07T23:50:00以后的值
1. IoTDB> SELECT temperature FROM root.ln.wf01.wt01 where time >= 2017-11-07T23:50:00
2. +-----------------------------+-----------------------------+
3. | Time|root.ln.wf01.wt01.temperature|
4. +-----------------------------+-----------------------------+
5. |2017-11-07T23:50:00.000+08:00| 23.7|
6. |2017-11-07T23:51:00.000+08:00| 22.24|
7. |2017-11-07T23:52:00.000+08:00| 20.18|
8. |2017-11-07T23:53:00.000+08:00| 24.58|
9. |2017-11-07T23:54:00.000+08:00| 22.52|
10. |2017-11-07T23:55:00.000+08:00| 25.9|
11. |2017-11-07T23:56:00.000+08:00| 24.44|
12. |2017-11-07T23:57:00.000+08:00| 24.39|
13. |2017-11-07T23:58:00.000+08:00| 22.93|
14. |2017-11-07T23:59:00.000+08:00| 21.07|
15. +-----------------------------+-----------------------------+
16. Total line number = 10
17. It costs 0.002s
我们发现root.ln.wf01.wt01.temperature的最后时间和值是2017-11-07T23:59:00和21.07。
SQL 示例:
1. SELECT last_value(temperature) FROM root.ln.wf01.wt01 GROUP BY([2017-11-07T23:50:00, 2017-11-08T00:01:00),1m) FILL (float[PREVIOUSUNTILLAST]);
2. SELECT last_value(temperature) FROM root.ln.wf01.wt01 GROUP BY([2017-11-07T23:50:00, 2017-11-08T00:01:00),1m) FILL (float[PREVIOUS]);
结果:
1. +-----------------------------+-----------------------------------------+
2. | Time|last_value(root.ln.wf01.wt01.temperature)|
3. +-----------------------------+-----------------------------------------+
4. |2017-11-07T23:50:00.000+08:00| 23.7|
5. |2017-11-07T23:51:00.000+08:00| 22.24|
6. |2017-11-07T23:52:00.000+08:00| 20.18|
7. |2017-11-07T23:53:00.000+08:00| 24.58|
8. |2017-11-07T23:54:00.000+08:00| 22.52|
9. |2017-11-07T23:55:00.000+08:00| 25.9|
10. |2017-11-07T23:56:00.000+08:00| 24.44|
11. |2017-11-07T23:57:00.000+08:00| 24.39|
12. |2017-11-07T23:58:00.000+08:00| 22.93|
13. |2017-11-07T23:59:00.000+08:00| 21.07|
14. |2017-11-08T00:00:00.000+08:00| null|
15. +-----------------------------+-----------------------------------------+
16. Total line number = 11
17. It costs 0.005s
19. +-----------------------------+-----------------------------------------+
20. | Time|last_value(root.ln.wf01.wt01.temperature)|
21. +-----------------------------+-----------------------------------------+
22. |2017-11-07T23:50:00.000+08:00| 23.7|
23. |2017-11-07T23:51:00.000+08:00| 22.24|
24. |2017-11-07T23:52:00.000+08:00| 20.18|
25. |2017-11-07T23:53:00.000+08:00| 24.58|
26. |2017-11-07T23:54:00.000+08:00| 22.52|
27. |2017-11-07T23:55:00.000+08:00| 25.9|
28. |2017-11-07T23:56:00.000+08:00| 24.44|
29. |2017-11-07T23:57:00.000+08:00| 24.39|
30. |2017-11-07T23:58:00.000+08:00| 22.93|
31. |2017-11-07T23:59:00.000+08:00| 21.07|
32. |2017-11-08T00:00:00.000+08:00| 21.07|
33. +-----------------------------+-----------------------------------------+
34. Total line number = 11
35. It costs 0.006s
解释:
使用 PREVIOUSUNTILLAST 将不会填充2017-11-07T23:59:00以后的值。
LIMIT & OFFSET
IoTDB提供 LIMIT/SLIMIT 子句和 OFFSET/SOFFSET 子句,以使用户可以更好地控制查询结果。使用LIMIT和SLIMIT子句可让用户控制查询结果的行数和列数, 并且使用OFFSET和SOFFSET子句允许用户设置结果显示的起始位置。
请注意,按组查询不支持LIMIT和OFFSET。
本章主要介绍查询结果的行和列控制的相关示例。你还可以使用 Java JDBC 标准接口执行查询。
- 查询结果的行控制
通过使用LIMIT和OFFSET子句,用户可以以与行相关的方式控制查询结果。 我们将通过以下示例演示如何使用LIMIT和OFFSET子句。
- 示例1:基本的LIMIT子句
SQL语句是:
1. select status, temperature from root.ln.wf01.wt01 limit 10
意思是:
所选设备为ln组wf01工厂wt01设备; 选择的时间序列是“状态”和“温度”。 SQL语句要求返回查询结果的前10行。
结果如下所示:
1. +-----------------------------+------------------------+-----------------------------+
2. | Time|root.ln.wf01.wt01.status|root.ln.wf01.wt01.temperature|
3. +-----------------------------+------------------------+-----------------------------+
4. |2017-11-01T00:00:00.000+08:00| true| 25.96|
5. |2017-11-01T00:01:00.000+08:00| true| 24.36|
6. |2017-11-01T00:02:00.000+08:00| false| 20.09|
7. |2017-11-01T00:03:00.000+08:00| false| 20.18|
8. |2017-11-01T00:04:00.000+08:00| false| 21.13|
9. |2017-11-01T00:05:00.000+08:00| false| 22.72|
10. |2017-11-01T00:06:00.000+08:00| false| 20.71|
11. |2017-11-01T00:07:00.000+08:00| false| 21.45|
12. |2017-11-01T00:08:00.000+08:00| false| 22.58|
13. |2017-11-01T00:09:00.000+08:00| false| 20.98|
14. +-----------------------------+------------------------+-----------------------------+
15. Total line number = 10
16. It costs 0.000s
- 示例2:带OFFSET的LIMIT子句
SQL语句是:
1. select status, temperature from root.ln.wf01.wt01 limit 5 offset 3
意思是:
所选设备为ln组wf01工厂wt01设备; 选择的时间序列是“状态”和“温度”。 SQL语句要求返回查询结果的第3至7行(第一行编号为0行)。
结果如下所示:
1. +-----------------------------+------------------------+-----------------------------+
2. | Time|root.ln.wf01.wt01.status|root.ln.wf01.wt01.temperature|
3. +-----------------------------+------------------------+-----------------------------+
4. |2017-11-01T00:03:00.000+08:00| false| 20.18|
5. |2017-11-01T00:04:00.000+08:00| false| 21.13|
6. |2017-11-01T00:05:00.000+08:00| false| 22.72|
7. |2017-11-01T00:06:00.000+08:00| false| 20.71|
8. |2017-11-01T00:07:00.000+08:00| false| 21.45|
9. +-----------------------------+------------------------+-----------------------------+
10. Total line number = 5
11. It costs 0.342s
- 示例3:LIMIT子句与WHERE子句结合
SQL语句是:
``` 1. select status,temperature from
(本文超出站点单文档体积上限,已截断)
