引言
在工业物联网(IIoT)场景中,时序数据库 Apache IoTDB 凭借其高效的写入性能和灵活的查询能力,成为处理海量设备数据的首选方案。然而在实际业务中,数据缺失和分页查询的性能瓶颈常困扰着开发者。
一、结果集补空值—FILL 子句的解构
1.1 功能介绍
当执行一些数据查询时,结果集的某行某列可能没有数据,则此位置结果为空,但这种空值不利于进行数据可视化展示和分析,需要对空值进行填充。
在 IoTDB 中,用户可以使用 FILL 子句指定数据缺失情况下的填充模式,允许用户按照特定的方法对任何查询的结果集填充空值,如取前一个不为空的值、线性插值等。
1.2 语法定义
FILL 子句的语法定义如下:
FILL '(' PREVIOUS | LINEAR | constant ')'
注意:
在 Fill 语句中只能指定一种填充方法,该方法作用于结果集的全部列。 空值填充不兼容 0.13 版本及以前的语法(即不支持 FILL((<data_type>[<fill_method>(, <before_range>, <after_range>)?])+))
1.3 填充方式
IoTDB 目前支持以下三种空值填充方式:
PREVIOUS 填充:使用该列前一个非空值进行填充。 LINEAR 填充:使用该列前一个非空值和下一个非空值的线性插值进行填充。 常量填充:使用指定常量填充。
对于数据类型不支持指定填充方法的列,既不会填充它,也不会报错,只是让那一列保持原样。
通过举例说明
如果我们不使用任何填充方式:
SELECT temperature, status FROM root.sgcc.wf03.wt01 WHERE time >= 2017-11-01T16:37:00.000 AND time <= 2017-11-01T16:40:00.000;
PREVIOUS 填充
对于查询结果集中的空值,使用该列前一个非空值进行填充。
注意:如果结果集的某一列第一个值就为空,则不会填充该值,直到遇到该列第一个非空值为止。
例如,使用 PREVIOUS 填充,SQL 语句如下:
SELECT temperature, status FROM root.sgcc.wf03.wt01 WHERE time T16:: T16:: FILL(PREVIOUS);


