运算符和函数

本章介绍 IoTDB 支持的运算符和函数。IoTDB 提供了丰富的内置运算符和函数来满足您的计算需求,同时支持通过用户自定义函数能力进行扩展。

可以使用 SHOW FUNCTIONS 显示所有可用函数的列表,包括内置函数和自定义函数。

关于运算符和函数在 SQL 中的行为,可以查看文档 选择表达式。

运算符列表

算数运算符

运算符 含义
+ 取正(单目)
- 取负(单目)
* 乘
/ 除
% 取余
+ 加
- 减

详细说明及示例见文档 算数运算符和函数。

比较运算符

运算符 含义
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= / <> 不等于
BETWEEN … AND … 在指定范围内
NOT BETWEEN … AND … 不在指定范围内
LIKE 匹配简单模式
NOT LIKE 无法匹配简单模式
REGEXP 匹配正则表达式
NOT REGEXP 无法匹配正则表达式
IS NULL 是空值
IS NOT NULL 不是空值
IN / CONTAINS 是指定列表中的值
NOT IN / NOT CONTAINS 不是指定列表中的值

详细说明及示例见文档 比较运算符和函数。

逻辑运算符

运算符 含义
NOT / ! 取非(单目)
AND / & / && 逻辑与
OR/ /

详细说明及示例见文档 逻辑运算符。

运算符优先级

运算符的优先级从高到低如下所示排列,同一行的运算符具有相同的优先级。

1. !, - (单目), + (单目)
2. *, /, DIV, %, MOD
3. -, +
4. =, ==, <=>, >=, >, <=, <, <>, !=
5. LIKE, REGEXP, NOT LIKE, NOT REGEXP
6. BETWEEN ... AND ..., NOT BETWEEN ... AND ...
7. IS NULL, IS NOT NULL
8. IN, CONTAINS, NOT IN, NOT CONTAINS
9. AND, &, &&
10. OR, |, ||

内置函数列表

列表中的函数无须注册即可在 IoTDB 中使用,数据函数质量库中的函数需要参考注册步骤进行注册后才能使用。

聚合函数

函数名 功能描述 允许的输入类型 输出类型
SUM 求和。 INT32 INT64 FLOAT DOUBLE DOUBLE
COUNT 计算数据点数。 所有类型 INT
AVG 求平均值。 INT32 INT64 FLOAT DOUBLE DOUBLE
EXTREME 求具有最大绝对值的值。如果正值和负值的最大绝对值相等,则返回正值。 INT32 INT64 FLOAT DOUBLE 与输入类型一致
MAX_VALUE 求最大值。 INT32 INT64 FLOAT DOUBLE 与输入类型一致
MIN_VALUE 求最小值。 INT32 INT64 FLOAT DOUBLE 与输入类型一致
FIRST_VALUE 求时间戳最小的值。 所有类型 与输入类型一致
LAST_VALUE 求时间戳最大的值。 所有类型 与输入类型一致
MAX_TIME 求最大时间戳。 所有类型 Timestamp
MIN_TIME 求最小时间戳。 所有类型 Timestamp
详细说明及示例见文档 聚合函数。

数学函数

函数名 输入序列类型 输出序列类型 Java 标准库中的对应实现
SIN INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#sin(double)
COS INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#cos(double)
TAN INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#tan(double)
ASIN INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#asin(double)
ACOS INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#acos(double)
ATAN INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#atan(double)
SINH INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#sinh(double)
COSH INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#cosh(double)
TANH INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#tanh(double)
DEGREES INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#toDegrees(double)
RADIANS INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#toRadians(double)
ABS INT32 / INT64 / FLOAT / DOUBLE 与输入序列的实际类型一致 Math#abs(int) / Math#abs(long) /Math#abs(float) /Math#abs(double)
SIGN INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#signum(double)
CEIL INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#ceil(double)
FLOOR INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#floor(double)
ROUND INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#rint(double)
EXP INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#exp(double)
LN INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#log(double)
LOG10 INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#log10(double)
SQRT INT32 / INT64 / FLOAT / DOUBLE DOUBLE Math#sqrt(double)

详细说明及示例见文档 算数运算符和函数。

比较函数

函数名 可接收的输入序列类型 必要的属性参数 输出序列类型 功能类型
ON_OFF INT32 / INT64 / FLOAT / DOUBLE threshold:DOUBLE BOOLEAN 返回ts_value >= threshold的bool值
IN_RANGE INT32 / INT64 / FLOAT / DOUBLE lower:DOUBLE upper:DOUBLE BOOLEAN 返回ts_value >= lower && ts_value <= upper的bool值

详细说明及示例见文档 比较运算符和函数。

字符串处理函数

函数名 输入序列类型 必要的属性参数 输出序列类型 功能描述
STRING_CONTAINS TEXT s: 待搜寻的字符串 BOOLEAN 判断字符串中是否存在s
STRING_MATCHES TEXT regex: Java 标准库风格的正则表达式 BOOLEAN 判断字符串是否能够被正则表达式regex匹配
LENGTH TEXT 无 INT32 返回字符串的长度
LOCATE TEXT target: 需要被定位的子串 reverse: 指定是否需要倒序定位,默认值为false, 即从左至右定位 INT32 获取target子串第一次出现在输入序列的位置,如果输入序列中不包含target则返回 -1
STARTSWITH TEXT target: 需要匹配的前缀 BOOLEAN 判断字符串是否有指定前缀
ENDSWITH TEXT target: 需要匹配的后缀 BOOLEAN 判断字符串是否有指定后缀
CONCAT TEXT targets: 一系列 K-V, key需要以target为前缀且不重复, value是待拼接的字符串。 series_behind: 指定拼接时时间序列是否在后面,默认为false。 TEXT 拼接字符串和target字串
SUBSTR TEXT start: 指定子串开始下标 end: 指定子串结束下标 TEXT 获取下标从start到end - 1的子串
UPPER TEXT 无 TEXT 将字符串转化为大写
LOWER TEXT 无 TEXT 将字符串转化为小写
TRIM TEXT 无 TEXT 移除字符串前后的空格
STRCMP TEXT 无 TEXT 用于比较两个输入序列,如果值相同返回 0 , 序列1的值小于序列2的值返回一个负数,序列1的值大于序列2的值返回一个正数

详细说明及示例见文档 字符串处理函数。

数据类型转换函数

函数名 必要的属性参数 输出序列类型 功能类型
CAST type:输出的数据点的类型,只能是 INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT 由输入属性参数type决定 将数据转换为type参数指定的类型。

详细说明及示例见文档 数据类型转换。

常序列生成函数

函数名 必要的属性参数 输出序列类型 功能描述
CONST value: 输出的数据点的值 type: 输出的数据点的类型,只能是 INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT 由输入属性参数 type 决定 根据输入属性 value 和 type 输出用户指定的常序列。
PI 无 DOUBLE 常序列的值:π 的 double 值,圆的周长与其直径的比值,即圆周率,等于 Java标准库 中的Math.PI。
E 无 DOUBLE 常序列的值:e 的 double 值,自然对数的底,它等于 Java 标准库 中的 Math.E。

详细说明及示例见文档 常序列生成函数。

选择函数

函数名 输入序列类型 必要的属性参数 输出序列类型 功能描述
TOP_K INT32 / INT64 / FLOAT / DOUBLE / TEXT k: 最多选择的数据点数,必须大于 0 小于等于 1000 与输入序列的实际类型一致 返回某时间序列中值最大的k个数据点。若多于k个数据点的值并列最大,则返回时间戳最小的数据点。
BOTTOM_K INT32 / INT64 / FLOAT / DOUBLE / TEXT k: 最多选择的数据点数,必须大于 0 小于等于 1000 与输入序列的实际类型一致 返回某时间序列中值最小的k个数据点。若多于k个数据点的值并列最小,则返回时间戳最小的数据点。

详细说明及示例见文档 选择函数。

区间查询函数

函数名 输入序列类型 属性参数 输出序列类型 功能描述
ZERO_DURATION INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN min:可选,默认值0 max:可选,默认值Long.MAX_VALUE Long 返回时间序列连续为0(false)的开始时间与持续时间,持续时间t(单位ms)满足t >= min && t <= max
NON_ZERO_DURATION INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN min:可选,默认值0 max:可选,默认值Long.MAX_VALUE Long 返回时间序列连续不为0(false)的开始时间与持续时间,持续时间t(单位ms)满足t >= min && t <= max
ZERO_COUNT INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN min:可选,默认值1 max:可选,默认值Long.MAX_VALUE Long 返回时间序列连续为0(false)的开始时间与其后数据点的个数,数据点个数n满足n >= min && n <= max
NON_ZERO_COUNT INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN min:可选,默认值1 max:可选,默认值Long.MAX_VALUE Long 返回时间序列连续不为0(false)的开始时间与其后数据点的个数,数据点个数n满足n >= min && n <= max

详细说明及示例见文档 区间查询函数。

趋势计算函数

函数名 输入序列类型 输出序列类型 功能描述
TIME_DIFFERENCE INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT INT64 统计序列中某数据点的时间戳与前一数据点时间戳的差。范围内第一个数据点没有对应的结果输出。
DIFFERENCE INT32 / INT64 / FLOAT / DOUBLE 与输入序列的实际类型一致 统计序列中某数据点的值与前一数据点的值的差。范围内第一个数据点没有对应的结果输出。
NON_NEGATIVE_DIFFERENCE INT32 / INT64 / FLOAT / DOUBLE 与输入序列的实际类型一致 统计序列中某数据点的值与前一数据点的值的差的绝对值。范围内第一个数据点没有对应的结果输出。
DERIVATIVE INT32 / INT64 / FLOAT / DOUBLE DOUBLE 统计序列中某数据点相对于前一数据点的变化率,数量上等同于 DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。
NON_NEGATIVE_DERIVATIVE INT32 / INT64 / FLOAT / DOUBLE DOUBLE 统计序列中某数据点相对于前一数据点的变化率的绝对值,数量上等同于 NON_NEGATIVE_DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。
函数名 输入序列类型 参数 输出序列类型 功能描述
DIFF INT32 / INT64 / FLOAT / DOUBLE ignoreNull:可选,默认为true;为true时,前一个数据点值为null时,忽略该数据点继续向前找到第一个出现的不为null的值;为false时,如果前一个数据点为null,则不忽略,使用null进行相减,结果也为null DOUBLE 统计序列中某数据点的值与前一数据点的值的差。第一个数据点没有对应的结果输出,输出值为null

详细说明及示例见文档 趋势计算函数。

采样函数

函数名 可接收的输入序列类型 必要的属性参数 输出序列类型 功能类型
EQUAL_SIZE_BUCKET_RANDOM_SAMPLE INT32 / INT64 / FLOAT / DOUBLE 降采样比例 proportion,取值范围为(0, 1],默认为0.1 INT32 / INT64 / FLOAT / DOUBLE 返回符合采样比例的等分桶随机采样
EQUAL_SIZE_BUCKET_AGG_SAMPLE INT32 / INT64 / FLOAT / DOUBLE proportion取值范围为(0, 1],默认为0.1 type:取值类型有avg, max, min, sum, extreme, variance, 默认为avg INT32 / INT64 / FLOAT / DOUBLE 返回符合采样比例的等分桶聚合采样
EQUAL_SIZE_BUCKET_M4_SAMPLE INT32 / INT64 / FLOAT / DOUBLE proportion取值范围为(0, 1],默认为0.1 INT32 / INT64 / FLOAT / DOUBLE 返回符合采样比例的等分桶M4采样
EQUAL_SIZE_BUCKET_OUTLIER_SAMPLE INT32 / INT64 / FLOAT / DOUBLE proportion取值范围为(0, 1],默认为0.1 type取值为avg或stendis或cos或prenextdis,默认为avg number取值应大于0,默认3 INT32 / INT64 / FLOAT / DOUBLE 返回符合采样比例和桶内采样个数的等分桶离群值采样
M4 INT32 / INT64 / FLOAT / DOUBLE 包含固定点数的窗口和滑动时间窗口使用不同的属性参数。包含固定点数的窗口使用属性windowSize和slidingStep。滑动时间窗口使用属性timeInterval、slidingStep、displayWindowBegin和displayWindowEnd。更多细节见下文。 INT32 / INT64 / FLOAT / DOUBLE 返回每个窗口内的第一个点(first)、最后一个点(last)、最小值点(bottom)、最大值点(top)。在一个窗口内的聚合点输出之前,M4会将它们按照时间戳递增排序并且去重。

数据质量函数库

对基于时序数据的应用而言,数据质量至关重要。基于用户自定义函数能力,IoTDB 提供了一系列关于数据质量的函数,包括数据画像、数据质量评估与修复等,能够满足工业领域对数据质量的需求。

该函数库中的函数不是内置函数,使用前要先加载到系统中。 操作流程如下:

  1. 下载包含全部依赖的 jar 包和注册脚本 【点击下载】概述 - 图1open in new window ;
  2. 将 jar 包复制到 IoTDB 程序目录的 ext\udf 目录下 (若您使用的是集群,请将jar包复制到所有DataNode的该目录下);
  3. 启动 IoTDB;
  4. 将注册脚本复制到 IoTDB 的程序目录下(与sbin目录同级的根目录下),修改脚本中的参数(如果需要)并运行注册脚本以注册 UDF。