本章介绍 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/ | / || | 逻辑或 |
详细说明及示例见文档 逻辑运算符。
运算符的优先级从高到低如下所示排列,同一行的运算符具有相同的优先级。
!, - (单目), + (单目) *, /, DIV, %, MOD -, + =, ==, <=>, >=, >, <=, <, <>, != LIKE, REGEXP, NOT LIKE, NOT REGEXP BETWEEN ... AND ..., NOT BETWEEN ... AND ... IS NULL, IS NOT NULL IN, CONTAINS, NOT IN, NOT CONTAINS AND, &, && 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:DOUBLEupper: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:可选,默认值0max:可选,默认值Long.MAX_VALUE | Long | 返回时间序列连续为0(false)的开始时间与持续时间,持续时间t(单位ms)满足t >= min && t <= max |
| NON_ZERO_DURATION | INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN | min:可选,默认值0max:可选,默认值Long.MAX_VALUE | Long | 返回时间序列连续不为0(false)的开始时间与持续时间,持续时间t(单位ms)满足t >= min && t <= max |
| ZERO_COUNT | INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN | min:可选,默认值1max:可选,默认值Long.MAX_VALUE | Long | 返回时间序列连续为0(false)的开始时间与其后数据点的个数,数据点个数n满足n >= min && n <= max |
| NON_ZERO_COUNT | INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN | min:可选,默认值1max:可选,默认值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.1type:取值类型有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.1type取值为avg或stendis或cos或prenextdis,默认为avgnumber取值应大于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 提供了一系列关于数据质量的函数,包括数据画像、数据质量评估与修复等,能够满足工业领域对数据质量的需求。
该函数库中的函数不是内置函数,使用前要先加载到系统中。 操作流程如下:
ext\udf 目录下 (若您使用的是集群,请将jar包复制到所有DataNode的该目录下);sbin目录同级的根目录下),修改脚本中的参数(如果需要)并运行注册脚本以注册 UDF。