运算符和函数

本章介绍 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 DOUBLEDOUBLE
COUNT计算数据点数。所有类型INT
AVG求平均值。INT32 INT64 FLOAT DOUBLEDOUBLE
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 标准库中的对应实现
SININT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#sin(double)
COSINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#cos(double)
TANINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#tan(double)
ASININT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#asin(double)
ACOSINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#acos(double)
ATANINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#atan(double)
SINHINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#sinh(double)
COSHINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#cosh(double)
TANHINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#tanh(double)
DEGREESINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#toDegrees(double)
RADIANSINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#toRadians(double)
ABSINT32 / INT64 / FLOAT / DOUBLE与输入序列的实际类型一致Math#abs(int) / Math#abs(long) /Math#abs(float) /Math#abs(double)
SIGNINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#signum(double)
CEILINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#ceil(double)
FLOORINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#floor(double)
ROUNDINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#rint(double)
EXPINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#exp(double)
LNINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#log(double)
LOG10INT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#log10(double)
SQRTINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#sqrt(double)

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

比较函数

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

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

字符串处理函数

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

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

数据类型转换函数

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

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

常序列生成函数

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

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

选择函数

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

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

区间查询函数

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

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

趋势计算函数

函数名输入序列类型输出序列类型功能描述
TIME_DIFFERENCEINT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXTINT64统计序列中某数据点的时间戳与前一数据点时间戳的差。范围内第一个数据点没有对应的结果输出。
DIFFERENCEINT32 / INT64 / FLOAT / DOUBLE与输入序列的实际类型一致统计序列中某数据点的值与前一数据点的值的差。范围内第一个数据点没有对应的结果输出。
NON_NEGATIVE_DIFFERENCEINT32 / INT64 / FLOAT / DOUBLE与输入序列的实际类型一致统计序列中某数据点的值与前一数据点的值的差的绝对值。范围内第一个数据点没有对应的结果输出。
DERIVATIVEINT32 / INT64 / FLOAT / DOUBLEDOUBLE统计序列中某数据点相对于前一数据点的变化率,数量上等同于 DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。
NON_NEGATIVE_DERIVATIVEINT32 / INT64 / FLOAT / DOUBLEDOUBLE统计序列中某数据点相对于前一数据点的变化率的绝对值,数量上等同于 NON_NEGATIVE_DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。

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

采样函数

函数名可接收的输入序列类型必要的属性参数输出序列类型功能类型
EQUAL_SIZE_BUCKET_RANDOM_SAMPLEINT32 / INT64 / FLOAT / DOUBLE降采样比例 proportion,取值范围为(0, 1],默认为0.1INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例的等分桶随机采样
EQUAL_SIZE_BUCKET_AGG_SAMPLEINT32 / INT64 / FLOAT / DOUBLEproportion取值范围为(0, 1],默认为0.1
type:取值类型有avg, max, min, sum, extreme, variance, 默认为avg
INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例的等分桶聚合采样
EQUAL_SIZE_BUCKET_M4_SAMPLEINT32 / INT64 / FLOAT / DOUBLEproportion取值范围为(0, 1],默认为0.1INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例的等分桶M4采样
EQUAL_SIZE_BUCKET_OUTLIER_SAMPLEINT32 / INT64 / FLOAT / DOUBLEproportion取值范围为(0, 1],默认为0.1
type取值为avgstendiscosprenextdis,默认为avg
number取值应大于0,默认3
INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例和桶内采样个数的等分桶离群值采样
M4INT32 / INT64 / FLOAT / DOUBLE包含固定点数的窗口和滑动时间窗口使用不同的属性参数。包含固定点数的窗口使用属性windowSizeslidingStep。滑动时间窗口使用属性timeIntervalslidingStepdisplayWindowBegindisplayWindowEnd。更多细节见下文。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。