运算符和函数
本章介绍 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。范围内第一个数据点没有对应的结果输出。 |
详细说明及示例见文档 趋势计算函数。
采样函数
函数名 | 可接收的输入序列类型 | 必要的属性参数 | 输出序列类型 | 功能类型 |
---|---|---|---|---|
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 提供了一系列关于数据质量的函数,包括数据画像、数据质量评估与修复等,能够满足工业领域对数据质量的需求。
该函数库中的函数不是内置函数,使用前要先加载到系统中。 操作流程如下:
- 下载包含全部依赖的 jar 包和注册脚本 【点击下载】open in new window ;
- 将 jar 包复制到 IoTDB 程序目录的
ext\udf
目录下 (若您使用的是集群,请将jar包复制到所有DataNode的该目录下); - 启动 IoTDB;
- 将注册脚本复制到 IoTDB 的程序目录下(与
sbin
目录同级的根目录下),修改脚本中的参数(如果需要)并运行注册脚本以注册 UDF。