跳至主要內容

结果集补空值

...大约 4 分钟

结果集补空值

功能介绍

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

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

语法定义

FILL 子句的语法定义如下:

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、常量

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

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

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

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

查询结果如下:

+-----------------------------+-------------------------------+--------------------------+
|                         Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:37:00.000+08:00|                          21.93|                      true|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:38:00.000+08:00|                           null|                     false|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:39:00.000+08:00|                          22.23|                      null|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:40:00.000+08:00|                          23.43|                      null|
+-----------------------------+-------------------------------+--------------------------+
Total line number = 4

PREVIOUS 填充

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

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

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

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 填充后的结果如下:

+-----------------------------+-------------------------------+--------------------------+
|                         Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:37:00.000+08:00|                          21.93|                      true|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:38:00.000+08:00|                          21.93|                     false|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:39:00.000+08:00|                          22.23|                     false|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:40:00.000+08:00|                          23.43|                     false|
+-----------------------------+-------------------------------+--------------------------+
Total line number = 4

LINEAR 填充

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

注意:

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

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

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 填充后的结果如下:

+-----------------------------+-------------------------------+--------------------------+
|                         Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:37:00.000+08:00|                          21.93|                      true|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:38:00.000+08:00|                          22.08|                     false|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:39:00.000+08:00|                          22.23|                      null|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:40:00.000+08:00|                          23.43|                      null|
+-----------------------------+-------------------------------+--------------------------+
Total line number = 4

常量填充

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

注意:

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

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

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

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 类型的常量填充后的结果如下:

+-----------------------------+-------------------------------+--------------------------+
|                         Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:37:00.000+08:00|                          21.93|                      true|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:38:00.000+08:00|                            2.0|                     false|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:39:00.000+08:00|                          22.23|                      null|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:40:00.000+08:00|                          23.43|                      null|
+-----------------------------+-------------------------------+--------------------------+
Total line number = 4

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

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 类型的常量填充后的结果如下:

+-----------------------------+-------------------------------+--------------------------+
|                         Time|root.sgcc.wf03.wt01.temperature|root.sgcc.wf03.wt01.status|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:37:00.000+08:00|                          21.93|                      true|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:38:00.000+08:00|                           null|                     false|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:39:00.000+08:00|                          22.23|                      true|
+-----------------------------+-------------------------------+--------------------------+
|2017-11-01T16:40:00.000+08:00|                          23.43|                      true|
+-----------------------------+-------------------------------+--------------------------+
Total line number = 4

Copyright © 2024 The Apache Software Foundation.
Apache IoTDB, IoTDB, Apache, the Apache feather logo, and the Apache IoTDB project logo are either registered trademarks or trademarks of The Apache Software Foundation in all countries

Have a question? Connect with us on QQ, WeChat, or Slack. Join the community now.