结果集补空值

功能介绍

当执行一些数据查询时,结果集的某行某列可能没有数据,则此位置结果为空,但这种空值不利于进行数据可视化展示和分析,需要对空值进行填充。

在 IoTDB 中,用户可以使用 FILL 子句指定数据缺失情况下的填充模式,允许用户按照特定的方法对任何查询的结果集填充空值,如取前一个不为空的值、线性插值等。

语法定义

FILL 子句的语法定义如下:

  1. FILL '(' PREVIOUS | LINEAR | constant ')'

注意:

  • Fill 语句中只能指定一种填充方法,该方法作用于结果集的全部列。
  • 空值填充不兼容 0.13 版本及以前的语法(即不支持 FILL((<data_type>[<fill_method>(, <before_range>, <after_range>)?])+)

填充方式

IoTDB 目前支持以下三种空值填充方式:

  • PREVIOUS 填充:使用该列前一个非空值进行填充。
  • LINEAR 填充:使用该列前一个非空值和下一个非空值的线性插值进行填充。
  • 常量填充:使用指定常量填充。

各数据类型支持的填充方法如下表所示:

数据类型支持的填充方法
BOOLEANPREVIOUS、常量
INT32PREVIOUSLINEAR、常量
INT64PREVIOUSLINEAR、常量
FLOATPREVIOUSLINEAR、常量
DOUBLEPREVIOUSLINEAR、常量
TEXTPREVIOUS、常量

注意: 对于数据类型不支持指定填充方法的列,既不会填充它,也不会报错,只是让那一列保持原样。

下面通过举例进一步说明。

如果我们不使用任何填充方式:

  1. select temperature, status from root.sgcc.wf03.wt01 where time >= 2017-11-01T16:37:00.000 and time <= 2017-11-01T16:40:00.000;

查询结果如下:

  1. +-----------------------------+-------------------------------+--------------------------+
  2. | Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
  3. +-----------------------------+-------------------------------+--------------------------+
  4. |2017-11-01T16:37:00.000+08:00| 21.93| true|
  5. +-----------------------------+-------------------------------+--------------------------+
  6. |2017-11-01T16:38:00.000+08:00| null| false|
  7. +-----------------------------+-------------------------------+--------------------------+
  8. |2017-11-01T16:39:00.000+08:00| 22.23| null|
  9. +-----------------------------+-------------------------------+--------------------------+
  10. |2017-11-01T16:40:00.000+08:00| 23.43| null|
  11. +-----------------------------+-------------------------------+--------------------------+
  12. Total line number = 4

PREVIOUS 填充

对于查询结果集中的空值,使用该列前一个非空值进行填充。

注意: 如果结果集的某一列第一个值就为空,则不会填充该值,直到遇到该列第一个非空值为止。

例如,使用 PREVIOUS 填充,SQL 语句如下:

  1. select temperature, status from root.sgcc.wf03.wt01 where time >= 2017-11-01T16:37:00.000 and time <= 2017-11-01T16:40:00.000 fill(previous);

PREVIOUS 填充后的结果如下:

  1. +-----------------------------+-------------------------------+--------------------------+
  2. | Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
  3. +-----------------------------+-------------------------------+--------------------------+
  4. |2017-11-01T16:37:00.000+08:00| 21.93| true|
  5. +-----------------------------+-------------------------------+--------------------------+
  6. |2017-11-01T16:38:00.000+08:00| 21.93| false|
  7. +-----------------------------+-------------------------------+--------------------------+
  8. |2017-11-01T16:39:00.000+08:00| 22.23| false|
  9. +-----------------------------+-------------------------------+--------------------------+
  10. |2017-11-01T16:40:00.000+08:00| 23.43| false|
  11. +-----------------------------+-------------------------------+--------------------------+
  12. Total line number = 4

LINEAR 填充

对于查询结果集中的空值,使用该列前一个非空值和下一个非空值的线性插值进行填充。

注意:

  • 如果某个值之前的所有值都为空,或者某个值之后的所有值都为空,则不会填充该值。
  • 如果某列的数据类型为boolean/text,我们既不会填充它,也不会报错,只是让那一列保持原样。

例如,使用 LINEAR 填充,SQL 语句如下:

  1. select temperature, status from root.sgcc.wf03.wt01 where time >= 2017-11-01T16:37:00.000 and time <= 2017-11-01T16:40:00.000 fill(linear);

LINEAR 填充后的结果如下:

  1. +-----------------------------+-------------------------------+--------------------------+
  2. | Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
  3. +-----------------------------+-------------------------------+--------------------------+
  4. |2017-11-01T16:37:00.000+08:00| 21.93| true|
  5. +-----------------------------+-------------------------------+--------------------------+
  6. |2017-11-01T16:38:00.000+08:00| 22.08| false|
  7. +-----------------------------+-------------------------------+--------------------------+
  8. |2017-11-01T16:39:00.000+08:00| 22.23| null|
  9. +-----------------------------+-------------------------------+--------------------------+
  10. |2017-11-01T16:40:00.000+08:00| 23.43| null|
  11. +-----------------------------+-------------------------------+--------------------------+
  12. Total line number = 4

常量填充

对于查询结果集中的空值,使用指定常量填充。

注意:

  • 如果某列数据类型与常量类型不兼容,既不填充该列,也不报错,将该列保持原样。对于常量兼容的数据类型,如下表所示:

    常量类型能够填充的序列数据类型
    BOOLEANBOOLEAN TEXT
    INT64INT32 INT64 FLOAT DOUBLE TEXT
    DOUBLEFLOAT DOUBLE TEXT
    TEXTTEXT
  • 当常量值大于 INT32 所能表示的最大值时,对于 INT32 类型的列,既不填充该列,也不报错,将该列保持原样。

例如,使用 FLOAT 类型的常量填充,SQL 语句如下:

  1. select temperature, status from root.sgcc.wf03.wt01 where time >= 2017-11-01T16:37:00.000 and time <= 2017-11-01T16:40:00.000 fill(2.0);

FLOAT 类型的常量填充后的结果如下:

  1. +-----------------------------+-------------------------------+--------------------------+
  2. | Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
  3. +-----------------------------+-------------------------------+--------------------------+
  4. |2017-11-01T16:37:00.000+08:00| 21.93| true|
  5. +-----------------------------+-------------------------------+--------------------------+
  6. |2017-11-01T16:38:00.000+08:00| 2.0| false|
  7. +-----------------------------+-------------------------------+--------------------------+
  8. |2017-11-01T16:39:00.000+08:00| 22.23| null|
  9. +-----------------------------+-------------------------------+--------------------------+
  10. |2017-11-01T16:40:00.000+08:00| 23.43| null|
  11. +-----------------------------+-------------------------------+--------------------------+
  12. Total line number = 4

再比如,使用 BOOLEAN 类型的常量填充,SQL 语句如下:

  1. select temperature, status from root.sgcc.wf03.wt01 where time >= 2017-11-01T16:37:00.000 and time <= 2017-11-01T16:40:00.000 fill(true);

BOOLEAN 类型的常量填充后的结果如下:

  1. +-----------------------------+-------------------------------+--------------------------+
  2. | Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
  3. +-----------------------------+-------------------------------+--------------------------+
  4. |2017-11-01T16:37:00.000+08:00| 21.93| true|
  5. +-----------------------------+-------------------------------+--------------------------+
  6. |2017-11-01T16:38:00.000+08:00| null| false|
  7. +-----------------------------+-------------------------------+--------------------------+
  8. |2017-11-01T16:39:00.000+08:00| 22.23| true|
  9. +-----------------------------+-------------------------------+--------------------------+
  10. |2017-11-01T16:40:00.000+08:00| 23.43| true|
  11. +-----------------------------+-------------------------------+--------------------------+
  12. Total line number = 4