| <!-- |
| |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| |
| --> |
| |
| # 基础函数 |
| |
| ## 1. 比较函数和运算符 |
| |
| ### 1.1 基本比较运算符 |
| |
| 比较运算符用于比较两个值,并返回比较结果(true或false)。 |
| |
| | 运算符 | 描述 | |
| | ------ | ---------- | |
| | < | 小于 | |
| | > | 大于 | |
| | <= | 小于或等于 | |
| | >= | 大于或等于 | |
| | = | 等于 | |
| | <> | 不等于 | |
| | != | 不等于 | |
| |
| #### 1.1.1 比较规则: |
| |
| 1. 所有类型都可以与自身进行比较 |
| 2. 数值类型(INT32, INT64, FLOAT, DOUBLE, TIMESTAMP)之间可以相互比较 |
| 3. 字符类型(STRING, TEXT)之间也可以相互比较 |
| 4. 除上述规则外的类型进行比较时,均会报错。 |
| |
| ### 1.2 BETWEEN 运算符 |
| |
| 1. `BETWEEN` 操作符用于判断一个值是否在指定的范围内。 |
| 2. `NOT BETWEEN`操作符用于判断一个值是否不在指定范围内。 |
| 3. `BETWEEN` 和 `NOT BETWEEN` 操作符可用于评估任何可排序的类型。 |
| 4. `BETWEEN` 和 `NOT BETWEEN` 的值、最小值和最大值参数必须是同一类型,否则会报错。 |
| |
| **语法**: |
| |
| ```SQL |
| value BETWEEN min AND max: |
| value NOT BETWEEN min AND max: |
| ``` |
| |
| 示例 1 :BETWEEN |
| |
| ```SQL |
| -- 查询 temperature 在 85.0 和 90.0 之间的记录 |
| SELECT * FROM table1 WHERE temperature BETWEEN 85.0 AND 90.0; |
| ``` |
| |
| 示例 2 :NOT BETWEEN |
| |
| ```SQL |
| 3-- 查询 humidity 不在 35.0 和 40.0 之间的记录 |
| SELECT * FROM table1 WHERE humidity NOT BETWEEN 35.0 AND 40.0; |
| ``` |
| |
| ### 1.3 IS NULL 运算符 |
| |
| 1. `IS NULL` 和 `IS NOT NULL` 运算符用于判断一个值是否为 NULL。 |
| 2. 这两个运算符适用于所有数据类型。 |
| |
| 示例1:查询 temperature 为 NULL 的记录 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE temperature IS NULL; |
| ``` |
| |
| 示例2:查询 humidity 不为 NULL 的记录 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE humidity IS NOT NULL; |
| ``` |
| |
| ### 1.4 IN 运算符 |
| |
| 1. `IN` 操作符可用于 `WHERE` 子句中,比较一列中的一些值。 |
| 2. 这些值可以由静态数组、标量表达式。 |
| |
| **语法:** |
| |
| ```SQL |
| ... WHERE column [NOT] IN ('value1','value2', expression1) |
| ``` |
| |
| 示例 1:静态数组:查询 region 为 '北京' 或 '上海' 的记录 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE region IN ('北京', '上海'); |
| --等价于 |
| SELECT * FROM region WHERE name = '北京' OR name = '上海'; |
| ``` |
| |
| 示例 2:标量表达式:查询 temperature 在特定值中的记录 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE temperature IN (85.0, 90.0); |
| ``` |
| |
| 示例 3:查询 region 不为 '北京' 或 '上海' 的记录 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE region NOT IN ('北京', '上海'); |
| ``` |
| |
| ### 1.5 GREATEST 和 LEAST |
| |
| `Greatest` 函数用于返回参数列表中的最大值,`Least` 函数用于返回参数列表中的最小值,返回数据类型与输入类型相同。 |
| 1. 空值处理:若所有参数均为 NULL,则返回 NULL。 |
| 2. 参数要求:必须提供 至少 2 个参数。 |
| 3. 类型约束:仅支持 相同数据类型 的参数比较。 |
| 4. 支持类型: `BOOLEAN`、`FLOAT`、`DOUBLE`、`INT32`、`INT64`、`STRING`、`TEXT`、`TIMESTAMP`、`DATE` |
| |
| **语法:** |
| |
| ```sql |
| greatest(value1, value2, ..., valueN) |
| least(value1, value2, ..., valueN) |
| ``` |
| |
| **示例:** |
| |
| ```sql |
| -- 查询 table2 中 temperature 和 humidity 的最大记录 |
| SELECT GREATEST(temperature,humidity) FROM table2; |
| |
| -- 查询 table2 中 temperature 和 humidity 的最小记录 |
| SELECT LEAST(temperature,humidity) FROM table2; |
| ``` |
| |
| |
| ## 2. 聚合函数 |
| |
| ### 2.1 概述 |
| |
| 1. 聚合函数是多对一函数。它们对一组值进行聚合计算,得到单个聚合结果。 |
| 2. 除了 `COUNT()`之外,其他所有聚合函数都忽略空值,并在没有输入行或所有值为空时返回空值。 例如,`SUM()` 返回 null 而不是零,而 `AVG()` 在计数中不包括 null 值。 |
| |
| ### 2.2 支持的聚合函数 |
| |
| | 函数名 | 功能描述 | 允许的输入类型 | 输出类型 | |
| |-----------------------|------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|------------------| |
| | COUNT | 计算数据点数。 | 所有类型 | INT64 | |
| | COUNT_IF | COUNT_IF(exp) 用于统计满足指定布尔表达式的记录行数 | exp 必须是一个布尔类型的表达式,例如 count_if(temperature>20) | INT64 | |
| | APPROX_COUNT_DISTINCT | APPROX_COUNT_DISTINCT(x[,maxStandardError]) 函数提供 COUNT(DISTINCT x) 的近似值,返回不同输入值的近似个数。 | x:待计算列,支持所有类型;<br> maxStandardError:指定该函数应产生的最大标准误差,取值范围[0.0040625, 0.26],未指定值时默认0.023。 | INT64 | |
| | SUM | 求和。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | AVG | 求平均值。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | MAX | 求最大值。 | 所有类型 | 与输入类型一致 | |
| | MIN | 求最小值。 | 所有类型 | 与输入类型一致 | |
| | FIRST | 求时间戳最小且不为 NULL 的值。 | 所有类型 | 与输入类型一致 | |
| | LAST | 求时间戳最大且不为 NULL 的值。 | 所有类型 | 与输入类型一致 | |
| | STDDEV | STDDEV_SAMP 的别名,求样本标准差。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | STDDEV_POP | 求总体标准差。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | STDDEV_SAMP | 求样本标准差。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | VARIANCE | VAR_SAMP 的别名,求样本方差。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | VAR_POP | 求总体方差。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | VAR_SAMP | 求样本方差。 | INT32 INT64 FLOAT DOUBLE | DOUBLE | |
| | EXTREME | 求具有最大绝对值的值。如果正值和负值的最大绝对值相等,则返回正值。 | INT32 INT64 FLOAT DOUBLE | 与输入类型一致 | |
| | MODE | 求众数。注意: 1.输入序列的不同值个数过多时会有内存异常风险; 2.如果所有元素出现的频次相同,即没有众数,则随机返回一个元素; 3.如果有多个众数,则随机返回一个众数; 4. NULL 值也会被统计频次,所以即使输入序列的值不全为 NULL,最终结果也可能为 NULL。 | 所有类型 | 与输入类型一致 | |
| | MAX_BY | MAX_BY(x, y) 求二元输入 x 和 y 在 y 最大时对应的 x 的值。MAX_BY(time, x) 返回 x 取最大值时对应的时间戳。 | x 和 y 可以是任意类型 | 与第一个输入 x 的数据类型一致 | |
| | MIN_BY | MIN_BY(x, y) 求二元输入 x 和 y 在 y 最小时对应的 x 的值。MIN_BY(time, x) 返回 x 取最小值时对应的时间戳。 | x 和 y 可以是任意类型 | 与第一个输入 x 的数据类型一致 | |
| | FIRST_BY | FIRST_BY(x, y) 求当 y 为第一个不为 NULL 的值时,同一行里对应的 x 值。 | x 和 y 可以是任意类型 | 与第一个输入 x 的数据类型一致 | |
| | LAST_BY | LAST_BY(x, y) 求当 y 为最后一个不为 NULL 的值时,同一行里对应的 x 值。 | x 和 y 可以是任意类型 | 与第一个输入 x 的数据类型一致 | |
| |
| |
| ### 2.3 示例 |
| |
| #### 2.3.1 示例数据 |
| |
| 在[示例数据页面](../Reference/Sample-Data.md)中,包含了用于构建表结构和插入数据的SQL语句,下载并在IoTDB CLI中执行这些语句,即可将数据导入IoTDB,您可以使用这些数据来测试和执行示例中的SQL语句,并获得相应的结果。 |
| |
| #### 2.3.2 Count |
| |
| 统计的是整张表的行数和 `temperature` 列非 NULL 值的数量。 |
| |
| ```SQL |
| IoTDB> select count(*), count(temperature) from table1; |
| ``` |
| |
| 执行结果如下: |
| |
| > 注意:只有COUNT函数可以与*一起使用,否则将抛出错误。 |
| |
| ```SQL |
| +-----+-----+ |
| |_col0|_col1| |
| +-----+-----+ |
| | 18| 12| |
| +-----+-----+ |
| Total line number = 1 |
| It costs 0.834s |
| ``` |
| |
| |
| #### 2.3.3 Count_if |
| |
| 统计 `table2` 中 到达时间 `arrival_time` 不是 `null` 的记录行数。 |
| |
| ```sql |
| IoTDB> select count_if(arrival_time is not null) from table2; |
| ``` |
| |
| 执行结果如下: |
| |
| ```sql |
| +-----+ |
| |_col0| |
| +-----+ |
| | 4| |
| +-----+ |
| Total line number = 1 |
| It costs 0.047s |
| ``` |
| |
| #### 2.3.4 Approx_count_distinct |
| |
| 查询 `table1` 中 `temperature` 列不同值的个数。 |
| |
| ```sql |
| IoTDB> SELECT COUNT(DISTINCT temperature) as origin, APPROX_COUNT_DISTINCT(temperature) as approx FROM table1; |
| IoTDB> SELECT COUNT(DISTINCT temperature) as origin, APPROX_COUNT_DISTINCT(temperature,0.006) as approx FROM table1; |
| ``` |
| |
| 执行结果如下: |
| |
| ```sql |
| +------+------+ |
| |origin|approx| |
| +------+------+ |
| | 3| 3| |
| +------+------+ |
| Total line number = 1 |
| It costs 0.022s |
| ``` |
| |
| |
| #### 2.3.5 First |
| |
| 查询`temperature`列、`humidity`列时间戳最小且不为 NULL 的值。 |
| |
| ```SQL |
| IoTDB> select first(temperature), first(humidity) from table1; |
| ``` |
| |
| 执行结果如下: |
| |
| ```SQL |
| +-----+-----+ |
| |_col0|_col1| |
| +-----+-----+ |
| | 90.0| 35.1| |
| +-----+-----+ |
| Total line number = 1 |
| It costs 0.170s |
| ``` |
| |
| #### 2.3.6 Last |
| |
| 查询`temperature`列、`humidity`列时间戳最大且不为 NULL 的值。 |
| |
| ```SQL |
| IoTDB> select last(temperature), last(humidity) from table1; |
| ``` |
| |
| 执行结果如下: |
| |
| ```SQL |
| +-----+-----+ |
| |_col0|_col1| |
| +-----+-----+ |
| | 90.0| 34.8| |
| +-----+-----+ |
| Total line number = 1 |
| It costs 0.211s |
| ``` |
| |
| #### 2.3.7 First_by |
| |
| 查询 `temperature` 列中非 NULL 且时间戳最小的行的 `time` 值,以及 `temperature` 列中非 NULL 且时间戳最小的行的 `humidity` 值。 |
| |
| ```SQL |
| IoTDB> select first_by(time, temperature), first_by(humidity, temperature) from table1; |
| ``` |
| |
| 执行结果如下: |
| |
| ```SQL |
| +-----------------------------+-----+ |
| | _col0|_col1| |
| +-----------------------------+-----+ |
| |2024-11-26T13:37:00.000+08:00| 35.1| |
| +-----------------------------+-----+ |
| Total line number = 1 |
| It costs 0.269s |
| ``` |
| |
| #### 2.3.8 Last_by |
| |
| 查询`temperature` 列中非 NULL 且时间戳最大的行的 `time` 值,以及 `temperature` 列中非 NULL 且时间戳最大的行的 `humidity` 值。 |
| |
| ```SQL |
| IoTDB> select last_by(time, temperature), last_by(humidity, temperature) from table1; |
| ``` |
| |
| 执行结果如下: |
| |
| ```SQL |
| +-----------------------------+-----+ |
| | _col0|_col1| |
| +-----------------------------+-----+ |
| |2024-11-30T14:30:00.000+08:00| 34.8| |
| +-----------------------------+-----+ |
| Total line number = 1 |
| It costs 0.070s |
| ``` |
| |
| #### 2.3.9 Max_by |
| |
| 查询`temperature` 列中最大值所在行的 `time` 值,以及`temperature` 列中最大值所在行的 `humidity` 值。 |
| |
| ```SQL |
| IoTDB> select max_by(time, temperature), max_by(humidity, temperature) from table1; |
| ``` |
| |
| 执行结果如下: |
| |
| ```SQL |
| +-----------------------------+-----+ |
| | _col0|_col1| |
| +-----------------------------+-----+ |
| |2024-11-30T09:30:00.000+08:00| 35.2| |
| +-----------------------------+-----+ |
| Total line number = 1 |
| It costs 0.172s |
| ``` |
| |
| #### 2.3.10 Min_by |
| |
| 查询`temperature` 列中最小值所在行的 `time` 值,以及`temperature` 列中最小值所在行的 `humidity` 值。 |
| |
| ```SQL |
| select min_by(time, temperature), min_by(humidity, temperature) from table1; |
| ``` |
| |
| 执行结果如下: |
| |
| ```SQL |
| +-----------------------------+-----+ |
| | _col0|_col1| |
| +-----------------------------+-----+ |
| |2024-11-29T10:00:00.000+08:00| null| |
| +-----------------------------+-----+ |
| Total line number = 1 |
| It costs 0.244s |
| ``` |
| |
| |
| ## 3. 逻辑运算符 |
| |
| ### 3.1 概述 |
| |
| 逻辑运算符用于组合条件或否定条件,返回布尔结果(`true` 或 `false`)。 |
| |
| 以下是常用的逻辑运算符及其描述: |
| |
| | 运算符 | 描述 | 示例 | |
| | ------ | ----------------------------- | ------- | |
| | AND | 仅当两个值都为 true 时为 true | a AND b | |
| | OR | 任一值为 true 时为 true | a OR b | |
| | NOT | 当值为 false 时为 true | NOT a | |
| |
| ### 3.2 NULL 对逻辑运算符的影响 |
| |
| #### 3.2.1 AND 运算符 |
| |
| - 如果表达式的一侧或两侧为 `NULL`,结果可能为 `NULL`。 |
| - 如果 `AND` 运算符的一侧为 `FALSE`,则表达式结果为 `FALSE`。 |
| |
| 示例: |
| |
| ```SQL |
| NULL AND true -- null |
| NULL AND false -- false |
| NULL AND NULL -- null |
| ``` |
| |
| #### 3.2.2 OR 运算符 |
| |
| - 如果表达式的一侧或两侧为 `NULL`,结果可能为 `NULL`。 |
| - 如果 `OR` 运算符的一侧为 `TRUE`,则表达式结果为 `TRUE`。 |
| |
| 示例: |
| |
| ```SQL |
| NULL OR NULL -- null |
| NULL OR false -- null |
| NULL OR true -- true |
| ``` |
| |
| ##### 3.2.2.1 真值表 |
| |
| 以下真值表展示了 `NULL` 在 `AND` 和 `OR` 运算符中的处理方式: |
| |
| | a | b | a AND b | a OR b | |
| | ----- | ----- | ------- | ------ | |
| | TRUE | TRUE | TRUE | TRUE | |
| | TRUE | FALSE | FALSE | TRUE | |
| | TRUE | NULL | NULL | TRUE | |
| | FALSE | TRUE | FALSE | TRUE | |
| | FALSE | FALSE | FALSE | FALSE | |
| | FALSE | NULL | FALSE | NULL | |
| | NULL | TRUE | NULL | TRUE | |
| | NULL | FALSE | FALSE | NULL | |
| | NULL | NULL | NULL | NULL | |
| |
| #### 3.2.3 NOT 运算符 |
| |
| NULL 的逻辑否定仍然是 NULL |
| |
| 示例: |
| |
| ```SQL |
| NOT NULL -- null |
| ``` |
| |
| ##### 3.2.3.1真值表 |
| |
| 以下真值表展示了 `NULL` 在 `NOT` 运算符中的处理方式: |
| |
| | a | NOT a | |
| | ----- | ----- | |
| | TRUE | FALSE | |
| | FALSE | TRUE | |
| | NULL | NULL | |
| |
| |
| ## 4. 日期和时间函数和运算符 |
| |
| ### 4.1 now() -> Timestamp |
| |
| 返回当前时间的时间戳。 |
| |
| ### 4.2 date_bin(interval, Timestamp[, Timestamp]) -> Timestamp |
| |
| `date_bin` 函数是一种用于处理时间数据的函数,作用是将一个时间戳(Timestamp)舍入到指定的时间间隔(interval)的边界上。 |
| |
| **语法:** |
| |
| ```SQL |
| -- 从时间戳为 0 开始计算时间间隔,返回最接近指定时间戳的时间间隔起始点 |
| date_bin(interval,source) |
| |
| -- 从时间戳为 origin 开始计算时间间隔,返回最接近指定时间戳的时间间隔起始点 |
| date_bin(interval,source,origin) |
| |
| -- interval支持的时间单位有: |
| -- 年y、月mo、周week、日d、小时h、分钟M、秒s、毫秒ms、微秒µs、纳秒ns。 |
| -- source必须为时间戳类型。 |
| ``` |
| |
| **参数:** |
| |
| | 参数 | 含义 | |
| | -------- | ------------------------------------------------------------ | |
| | interval | 时间间隔支持的时间单位有:年y、月mo、周week、日d、小时h、分钟M、秒s、毫秒ms、微秒µs、纳秒ns。 | |
| | source | 待计算时间列,也可以是表达式。必须为时间戳类型。 | |
| | origin | 起始时间戳 | |
| |
| #### 4.2.1 语法约定: |
| |
| 1. 不传入 `origin` 时,起始时间戳从 1970-01-01T00:00:00Z 开始计算(北京时间为 1970-01-01 08:00:00)。 |
| 2. `interval` 为一个非负数,且必须带上时间单位。`interval` 为 0ms 时,不进行计算,直接返回 `source`。 |
| 3. 当传入 `origin` 或 `source` 为负时,表示纪元时间之前的某个时间点,`date_bin` 会正常计算并返回与该时间点相关的时间段。 |
| 4. 如果 `source` 中的值为 `null`,则返回 `null`。 |
| 5. 不支持月份和非月份时间单位混用,例如 `1 MONTH 1 DAY`,这种时间间隔有歧义。 |
| |
| > 假设是起始时间是 2000 年 4 月 30 日进行计算,那么在一个时间间隔后,如果是先算 DAY再算MONTH,则会得到 2000 年 6 月 1 日,如果先算 MONTH 再算 DAY 则会得到 2000 年 5 月 31 日,二者得出的时间日期不同。 |
| |
| #### 4.2.2 示例 |
| |
| ##### 示例数据 |
| |
| 在[示例数据页面](../Reference/Sample-Data.md)中,包含了用于构建表结构和插入数据的SQL语句,下载并在IoTDB CLI中执行这些语句,即可将数据导入IoTDB,您可以使用这些数据来测试和执行示例中的SQL语句,并获得相应的结果。 |
| |
| 示例 1:不指定起始时间戳 |
| |
| ```SQL |
| SELECT |
| time, |
| date_bin(1h,time) as time_bin |
| FROM |
| table1; |
| ``` |
| |
| 结果: |
| |
| ```Plain |
| +-----------------------------+-----------------------------+ |
| | time| time_bin| |
| +-----------------------------+-----------------------------+ |
| |2024-11-30T09:30:00.000+08:00|2024-11-30T09:00:00.000+08:00| |
| |2024-11-30T14:30:00.000+08:00|2024-11-30T14:00:00.000+08:00| |
| |2024-11-29T10:00:00.000+08:00|2024-11-29T10:00:00.000+08:00| |
| |2024-11-27T16:38:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:39:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:40:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:41:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:42:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:43:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:44:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-29T11:00:00.000+08:00|2024-11-29T11:00:00.000+08:00| |
| |2024-11-29T18:30:00.000+08:00|2024-11-29T18:00:00.000+08:00| |
| |2024-11-28T08:00:00.000+08:00|2024-11-28T08:00:00.000+08:00| |
| |2024-11-28T09:00:00.000+08:00|2024-11-28T09:00:00.000+08:00| |
| |2024-11-28T10:00:00.000+08:00|2024-11-28T10:00:00.000+08:00| |
| |2024-11-28T11:00:00.000+08:00|2024-11-28T11:00:00.000+08:00| |
| |2024-11-26T13:37:00.000+08:00|2024-11-26T13:00:00.000+08:00| |
| |2024-11-26T13:38:00.000+08:00|2024-11-26T13:00:00.000+08:00| |
| +-----------------------------+-----------------------------+ |
| Total line number = 18 |
| It costs 0.683s |
| ``` |
| |
| 示例 2:指定起始时间戳 |
| |
| ```SQL |
| SELECT |
| time, |
| date_bin(1h, time, 2024-11-29T18:30:00.000) as time_bin |
| FROM |
| table1; |
| ``` |
| |
| 结果: |
| |
| ```Plain |
| +-----------------------------+-----------------------------+ |
| | time| time_bin| |
| +-----------------------------+-----------------------------+ |
| |2024-11-30T09:30:00.000+08:00|2024-11-30T09:30:00.000+08:00| |
| |2024-11-30T14:30:00.000+08:00|2024-11-30T14:30:00.000+08:00| |
| |2024-11-29T10:00:00.000+08:00|2024-11-29T09:30:00.000+08:00| |
| |2024-11-27T16:38:00.000+08:00|2024-11-27T16:30:00.000+08:00| |
| |2024-11-27T16:39:00.000+08:00|2024-11-27T16:30:00.000+08:00| |
| |2024-11-27T16:40:00.000+08:00|2024-11-27T16:30:00.000+08:00| |
| |2024-11-27T16:41:00.000+08:00|2024-11-27T16:30:00.000+08:00| |
| |2024-11-27T16:42:00.000+08:00|2024-11-27T16:30:00.000+08:00| |
| |2024-11-27T16:43:00.000+08:00|2024-11-27T16:30:00.000+08:00| |
| |2024-11-27T16:44:00.000+08:00|2024-11-27T16:30:00.000+08:00| |
| |2024-11-29T11:00:00.000+08:00|2024-11-29T10:30:00.000+08:00| |
| |2024-11-29T18:30:00.000+08:00|2024-11-29T18:30:00.000+08:00| |
| |2024-11-28T08:00:00.000+08:00|2024-11-28T07:30:00.000+08:00| |
| |2024-11-28T09:00:00.000+08:00|2024-11-28T08:30:00.000+08:00| |
| |2024-11-28T10:00:00.000+08:00|2024-11-28T09:30:00.000+08:00| |
| |2024-11-28T11:00:00.000+08:00|2024-11-28T10:30:00.000+08:00| |
| |2024-11-26T13:37:00.000+08:00|2024-11-26T13:30:00.000+08:00| |
| |2024-11-26T13:38:00.000+08:00|2024-11-26T13:30:00.000+08:00| |
| +-----------------------------+-----------------------------+ |
| Total line number = 18 |
| It costs 0.056s |
| ``` |
| |
| 示例 3:`origin` 为负数的情况 |
| |
| ```SQL |
| SELECT |
| time, |
| date_bin(1h, time, 1969-12-31 00:00:00.000) as time_bin |
| FROM |
| table1; |
| ``` |
| |
| 结果: |
| |
| ```Plain |
| +-----------------------------+-----------------------------+ |
| | time| time_bin| |
| +-----------------------------+-----------------------------+ |
| |2024-11-30T09:30:00.000+08:00|2024-11-30T09:00:00.000+08:00| |
| |2024-11-30T14:30:00.000+08:00|2024-11-30T14:00:00.000+08:00| |
| |2024-11-29T10:00:00.000+08:00|2024-11-29T10:00:00.000+08:00| |
| |2024-11-27T16:38:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:39:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:40:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:41:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:42:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:43:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:44:00.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-29T11:00:00.000+08:00|2024-11-29T11:00:00.000+08:00| |
| |2024-11-29T18:30:00.000+08:00|2024-11-29T18:00:00.000+08:00| |
| |2024-11-28T08:00:00.000+08:00|2024-11-28T08:00:00.000+08:00| |
| |2024-11-28T09:00:00.000+08:00|2024-11-28T09:00:00.000+08:00| |
| |2024-11-28T10:00:00.000+08:00|2024-11-28T10:00:00.000+08:00| |
| |2024-11-28T11:00:00.000+08:00|2024-11-28T11:00:00.000+08:00| |
| |2024-11-26T13:37:00.000+08:00|2024-11-26T13:00:00.000+08:00| |
| |2024-11-26T13:38:00.000+08:00|2024-11-26T13:00:00.000+08:00| |
| +-----------------------------+-----------------------------+ |
| Total line number = 18 |
| It costs 0.203s |
| ``` |
| |
| 示例 4:`interval` 为 0 的情况 |
| |
| ```SQL |
| SELECT |
| time, |
| date_bin(0ms, time) as time_bin |
| FROM |
| table1; |
| ``` |
| |
| 结果: |
| |
| ```Plain |
| +-----------------------------+-----------------------------+ |
| | time| time_bin| |
| +-----------------------------+-----------------------------+ |
| |2024-11-30T09:30:00.000+08:00|2024-11-30T09:30:00.000+08:00| |
| |2024-11-30T14:30:00.000+08:00|2024-11-30T14:30:00.000+08:00| |
| |2024-11-29T10:00:00.000+08:00|2024-11-29T10:00:00.000+08:00| |
| |2024-11-27T16:38:00.000+08:00|2024-11-27T16:38:00.000+08:00| |
| |2024-11-27T16:39:00.000+08:00|2024-11-27T16:39:00.000+08:00| |
| |2024-11-27T16:40:00.000+08:00|2024-11-27T16:40:00.000+08:00| |
| |2024-11-27T16:41:00.000+08:00|2024-11-27T16:41:00.000+08:00| |
| |2024-11-27T16:42:00.000+08:00|2024-11-27T16:42:00.000+08:00| |
| |2024-11-27T16:43:00.000+08:00|2024-11-27T16:43:00.000+08:00| |
| |2024-11-27T16:44:00.000+08:00|2024-11-27T16:44:00.000+08:00| |
| |2024-11-29T11:00:00.000+08:00|2024-11-29T11:00:00.000+08:00| |
| |2024-11-29T18:30:00.000+08:00|2024-11-29T18:30:00.000+08:00| |
| |2024-11-28T08:00:00.000+08:00|2024-11-28T08:00:00.000+08:00| |
| |2024-11-28T09:00:00.000+08:00|2024-11-28T09:00:00.000+08:00| |
| |2024-11-28T10:00:00.000+08:00|2024-11-28T10:00:00.000+08:00| |
| |2024-11-28T11:00:00.000+08:00|2024-11-28T11:00:00.000+08:00| |
| |2024-11-26T13:37:00.000+08:00|2024-11-26T13:37:00.000+08:00| |
| |2024-11-26T13:38:00.000+08:00|2024-11-26T13:38:00.000+08:00| |
| +-----------------------------+-----------------------------+ |
| Total line number = 18 |
| It costs 0.107s |
| ``` |
| |
| 示例 5:`source` 为 null 的情况 |
| |
| ```SQL |
| SELECT |
| arrival_time, |
| date_bin(1h,arrival_time) as time_bin |
| FROM |
| table1; |
| ``` |
| |
| 结果: |
| |
| ```Plain |
| +-----------------------------+-----------------------------+ |
| | arrival_time| time_bin| |
| +-----------------------------+-----------------------------+ |
| | null| null| |
| |2024-11-30T14:30:17.000+08:00|2024-11-30T14:00:00.000+08:00| |
| |2024-11-29T10:00:13.000+08:00|2024-11-29T10:00:00.000+08:00| |
| |2024-11-27T16:37:01.000+08:00|2024-11-27T16:00:00.000+08:00| |
| | null| null| |
| |2024-11-27T16:37:03.000+08:00|2024-11-27T16:00:00.000+08:00| |
| |2024-11-27T16:37:04.000+08:00|2024-11-27T16:00:00.000+08:00| |
| | null| null| |
| | null| null| |
| |2024-11-27T16:37:08.000+08:00|2024-11-27T16:00:00.000+08:00| |
| | null| null| |
| |2024-11-29T18:30:15.000+08:00|2024-11-29T18:00:00.000+08:00| |
| |2024-11-28T08:00:09.000+08:00|2024-11-28T08:00:00.000+08:00| |
| | null| null| |
| |2024-11-28T10:00:11.000+08:00|2024-11-28T10:00:00.000+08:00| |
| |2024-11-28T11:00:12.000+08:00|2024-11-28T11:00:00.000+08:00| |
| |2024-11-26T13:37:34.000+08:00|2024-11-26T13:00:00.000+08:00| |
| |2024-11-26T13:38:25.000+08:00|2024-11-26T13:00:00.000+08:00| |
| +-----------------------------+-----------------------------+ |
| Total line number = 18 |
| It costs 0.319s |
| ``` |
| |
| ## 5. 数学函数和运算符 |
| |
| ### 5.1 数学运算符 |
| |
| | **运算符** | **描述** | |
| | ---------- | ------------------------ | |
| | + | 加法 | |
| | - | 减法 | |
| | * | 乘法 | |
| | / | 除法(整数除法执行截断) | |
| | % | 模(余数) | |
| | - | 取反 | |
| |
| ### 5.2 数学函数 |
| |
| | 函数名 | 描述 | 输入 | 输出 | 用法 | |
| |-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------| ---------------------- | ---------- | |
| | sin | 正弦函数 | double、float、INT64、INT32 | double | sin(x) | |
| | cos | 余弦函数 | double、float、INT64、INT32 | double | cos(x) | |
| | tan | 正切函数 | double、float、INT64、INT32 | double | tan(x) | |
| | asin | 反正弦函数 | double、float、INT64、INT32 | double | asin(x) | |
| | acos | 反余弦函数 | double、float、INT64、INT32 | double | acos(x) | |
| | atan | 反正切函数 | double、float、INT64、INT32 | double | atan(x) | |
| | sinh | 双曲正弦函数 | double、float、INT64、INT32 | double | sinh(x) | |
| | cosh | 双曲余弦函数 | double、float、INT64、INT32 | double | cosh(x) | |
| | tanh | 双曲正切函数 | double、float、INT64、INT32 | double | tanh(x) | |
| | degrees | 将弧度角 x 转换为度 | double、float、INT64、INT32 | double | degrees(x) | |
| | radians | 将度转换为弧度 | double、float、INT64、INT32 | double | radians(x) | |
| | abs | 绝对值 | double、float、INT64、INT32 | 返回与输入类型相同的值 | abs(x) | |
| | sign | 返回 x 的符号函数,即:如果参数为 0,则返回 0,如果参数大于 0,则返回 1,如果参数小于 0,则返回 -1。对于 double/float 类型的参数,函数还会返回:如果参数为 NaN,则返回 NaN,如果参数为 +Infinity,则返回 1.0,如果参数为 -Infinity,则返回 -1.0。 | double、float、INT64、INT32 | 返回与输入类型相同的值 | sign(x) | |
| | ceil | 返回 x 向上取整到最近的整数。 | double、float、INT64、INT32 | double | ceil(x) | |
| | floor | 返回 x 向下取整到最近的整数。 | double、float、INT64、INT32 | double | floor(x) | |
| | exp | 返回欧拉数 e 的 x 次幂。 | double、float、INT64、INT32 | double | exp(x) | |
| | ln | 返回 x 的自然对数。 | double、float、INT64、INT32 | double | ln(x) | |
| | log10 | 返回 x 的以 10 为底的对数。 | double、float、INT64、INT32 | double | log10(x) | |
| | round | 返回 x 四舍五入到最近的整数。 | double、float、INT64、INT32 | double | round(x) | |
| | round | 返回 x 四舍五入到 d 位小数。 | double、float、INT64、INT32 | double | round(x, d) | |
| | sqrt | 返回 x 的平方根。 | double、float、INT64、INT32 | double | sqrt(x) | |
| | e | 自然指数 | | double | e() | |
| | pi | π | | double | pi() | |
| |
| ## 6. 条件表达式 |
| |
| ### 6.1 CASE 表达式 |
| |
| CASE 表达式有两种形式:简单形式、搜索形式 |
| |
| #### 6.1.1 简单形式 |
| |
| 简单形式从左到右搜索每个值表达式,直到找到一个与表达式相等的值: |
| |
| ```SQL |
| CASE expression |
| WHEN value THEN result |
| [ WHEN ... ] |
| [ ELSE result ] |
| END |
| ``` |
| |
| 如果找到匹配的值,则返回相应的结果。如果没有找到匹配项,则返回 ELSE 子句中的结果(如果存在),否则返回 null。例如: |
| |
| ```SQL |
| SELECT a, |
| CASE a |
| WHEN 1 THEN 'one' |
| WHEN 2 THEN 'two' |
| ELSE 'many' |
| END |
| ``` |
| |
| #### 6.1.2 搜索形式 |
| |
| 搜索形式从左到右评估每个布尔条件,直到找到一个为真的条件,并返回相应的结果: |
| |
| ```SQL |
| CASE |
| WHEN condition THEN result |
| [ WHEN ... ] |
| [ ELSE result ] |
| END |
| ``` |
| |
| 如果没有条件为真,则返回 ELSE 子句中的结果(如果存在),否则返回 null。例如: |
| |
| ```SQL |
| SELECT a, b, |
| CASE |
| WHEN a = 1 THEN 'aaa' |
| WHEN b = 2 THEN 'bbb' |
| ELSE 'ccc' |
| END |
| ``` |
| |
| ### 6.2. COALESCE 函数 |
| |
| 返回参数列表中的第一个非空值。 |
| |
| ```SQL |
| coalesce(value1, value2[, ...]) |
| ``` |
| |
| ## 7. 转换函数 |
| |
| ### 7.1 转换函数 |
| |
| #### 7.1.1 cast(value AS type) → type |
| |
| 1. 显式地将一个值转换为指定类型。 |
| 2. 可以用于将字符串(varchar)转换为数值类型,或数值转换为字符串类型。 |
| 3. 如果转换失败,将抛出运行时错误。 |
| |
| 示例: |
| |
| ```SQL |
| SELECT * |
| FROM table1 |
| WHERE CAST(time AS DATE) |
| IN (CAST('2024-11-27' AS DATE), CAST('2024-11-28' AS DATE)); |
| ``` |
| |
| #### 7.1.2 try_cast(value AS type) → type |
| |
| 1. 与 `cast()` 类似。 |
| 2. 如果转换失败,则返回 `null`。 |
| |
| 示例: |
| |
| ```SQL |
| SELECT * |
| FROM table1 |
| WHERE try_cast(time AS DATE) |
| IN (try_cast('2024-11-27' AS DATE), try_cast('2024-11-28' AS DATE)); |
| ``` |
| |
| ### 7.2 Format 函数 |
| 该函数基于指定的格式字符串与输入参数,生成并返回格式化后的字符串输出。其功能与 Java 语言中的`String.format` 方法及 C 语言中的`printf`函数相类似,支持开发者通过占位符语法构建动态字符串模板,其中预设的格式标识符将被传入的对应参数值精准替换,最终形成符合特定格式要求的完整字符串。 |
| |
| #### 7.2.1 语法介绍 |
| |
| ```SQL |
| format(pattern,...args) -> String |
| ``` |
| |
| **参数定义** |
| |
| * `pattern`: 格式字符串,可包含静态文本及一个或多个格式说明符(如 `%s`, `%d` 等),或任意返回类型为 `STRING/TEXT` 的表达式。 |
| * `args`: 用于替换格式说明符的输入参数。需满足以下条件: |
| * 参数数量 ≥ 1 |
| * 若存在多个参数,以逗号`,`分隔(如 `arg1,arg2`) |
| * 参数总数可多于 `pattern` 中的占位符数量,但不可少于,否则触发异常 |
| |
| **返回值** |
| |
| * 类型为 `STRING` 的格式化结果字符串 |
| |
| #### 7.2.2 使用示例 |
| |
| 1. 格式化浮点数 |
| |
| ```SQL |
| IoTDB:database1> select format('%.5f',humidity) from table1 where humidity = 35.4 |
| +--------+ |
| | _col0| |
| +--------+ |
| |35.40000| |
| +--------+ |
| ``` |
| |
| 2. 格式化整数 |
| |
| ```SQL |
| IoTDB:database1> select format('%03d',8) from table1 limit 1 |
| +-----+ |
| |_col0| |
| +-----+ |
| | 008| |
| +-----+ |
| ``` |
| |
| 3. 格式化日期和时间戳 |
| |
| * Locale-specific日期 |
| |
| ```SQL |
| IoTDB:database1> SELECT format('%1$tA, %1$tB %1$te, %1$tY', 2024-01-01) from table1 limit 1 |
| +--------------------+ |
| | _col0| |
| +--------------------+ |
| |星期一, 一月 1, 2024| |
| +--------------------+ |
| ``` |
| |
| * 去除时区信息 |
| |
| ```SQL |
| IoTDB:database1> SELECT format('%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL', 2024-01-01T00:00:00.000+08:00) from table1 limit 1 |
| +-----------------------+ |
| | _col0| |
| +-----------------------+ |
| |2024-01-01 00:00:00.000| |
| +-----------------------+ |
| ``` |
| |
| * 获取秒级时间戳精度 |
| |
| ```SQL |
| IoTDB:database1> SELECT format('%1$tF %1$tT', 2024-01-01T00:00:00.000+08:00) from table1 limit 1 |
| +-------------------+ |
| | _col0| |
| +-------------------+ |
| |2024-01-01 00:00:00| |
| +-------------------+ |
| ``` |
| |
| * 日期符号说明如下 |
| |
| | **符号** | ** 描述** | |
| | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
| | 'H' | 24 小时制的小时数,格式为两位数,必要时加上前导零,i.e. 00 - 23。 | |
| | 'I' | 12 小时制的小时数,格式为两位数,必要时加上前导零,i.e. 01 - 12。 | |
| | 'k' | 24 小时制的小时数,i.e. 0 - 23。 | |
| | 'l' | 12 小时制的小时数,i.e. 1 - 12。 | |
| | 'M' | 小时内的分钟,格式为两位数,必要时加上前导零,i.e. 00 - 59。 | |
| | 'S' | 分钟内的秒数,格式为两位数,必要时加上前导零,i.e. 00 - 60(“60 ”是支持闰秒所需的特殊值)。 | |
| | 'L' | 秒内毫秒,格式为三位数,必要时加前导零,i.e. 000 - 999。 | |
| | 'N' | 秒内的纳秒,格式为九位数,必要时加前导零,i.e. 000000000 - 999999999。 | |
| | 'p' | 当地特定的[上午或下午](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/text/DateFormatSymbols.html#getAmPmStrings())标记,小写,如 “am ”或 “pm”。使用转换前缀 “T ”会强制输出为大写。 | |
| | 'z' | 从格林尼治标准时间偏移的[RFC 822](http://www.ietf.org/rfc/rfc0822.txt)式数字时区,例如 -0800。该值将根据夏令时的需要进行调整。对于 long、[Long](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/Long.html)和[Date](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/Date.html),使用的时区是 Java 虚拟机此实例的[默认时区](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/TimeZone.html#getDefault())。 | |
| | 'Z' | 表示时区缩写的字符串。该值将根据夏令时的需要进行调整。对于 long、[Long](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/lang/Long.html)和[Date](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/Date.html),使用的时区是此 Java 虚拟机实例的[默认时区](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/TimeZone.html#getDefault())。Formatter 的时区将取代参数的时区(如果有)。 | |
| | 's' | 自 1970 年 1 月 1 日 00:00:00 UTC 开始的纪元起的秒数,i.e. Long.MIN\_VALUE/1000 至 Long.MAX\_VALUE/1000。 | |
| | 'Q' | 自 1970 年 1 月 1 日 00:00:00 UTC 开始的纪元起的毫秒数,i.e. Long.MIN\_VALUE 至 Long.MAX\_VALUE。 | |
| |
| * 用于格式化常见的日期/时间组成的转换字符说明如下 |
| |
| | **符号** | **描述** | |
| | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
| | 'B' | 特定于区域设置[的完整月份名称](https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/text/DateFormatSymbols.html#getMonths()),例如 “January”、“February”。 | |
| | 'b' | 当地特定月份的缩写名称,如"1 月"、"2 月"。 | |
| | 'h' | 与"b "相同。 | |
| | 'A' | 一周中某一天在当地的全称,如"星期日"、"星期一"。 | |
| | 'a' | 当地特有的星期简短名称,例如"星期日"、"星期一 | |
| | 'C' | 四位数年份除以100,格式为两位数,必要时加上前导零,即00 - 99 | |
| | 'Y' | 年份,格式为至少四位数,必要时加上前导零,例如0092相当于公历92年。 | |
| | 'y' | 年份的最后两位数,格式为必要的前导零,即00 - 99。 | |
| | 'j' | 年号,格式为三位数,必要时加前导零,例如公历为001 - 366。 | |
| | 'm' | 月份,格式为两位数,必要时加前导零,即01 - 13。 | |
| | 'd' | 月日,格式为两位数,必要时加前导零,即01 - 31 | |
| | 'e' | 月日,格式为两位数,即1 - 31。 | |
| |
| 4. 格式化字符串 |
| |
| ```SQL |
| IoTDB:database1> SELECT format('The measurement status is :%s',status) FROM table2 limit 1 |
| +-------------------------------+ |
| | _col0| |
| +-------------------------------+ |
| |The measurement status is :true| |
| +-------------------------------+ |
| ``` |
| |
| 5. 格式化百分号 |
| |
| ```SQL |
| IoTDB:database1> SELECT format('%s%%', 99.9) from table1 limit 1 |
| +-----+ |
| |_col0| |
| +-----+ |
| |99.9%| |
| +-----+ |
| ``` |
| |
| #### 7.2.3 **格式转换失败场景说明** |
| |
| 1. 类型不匹配错误 |
| |
| * 时间戳类型冲突 若格式说明符中包含时间相关标记(如 `%Y-%m-%d`),但参数提供: |
| * 非 `DATE`/`TIMESTAMP` 类型值 |
| * 或涉及日期细粒度单位(如 `%H` 小时、`%M` 分钟)时,参数仅支持 `TIMESTAMP` 类型,否则将抛出类型异常 |
| |
| ```SQL |
| -- 示例1 |
| IoTDB:database1> SELECT format('%1$tA, %1$tB %1$te, %1$tY', humidity) from table2 limit 1 |
| Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Invalid format string: %1$tA, %1$tB %1$te, %1$tY (IllegalFormatConversion: A != java.lang.Float) |
| |
| -- 示例2 |
| IoTDB:database1> SELECT format('%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL', humidity) from table1 limit 1 |
| Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Invalid format string: %1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL (IllegalFormatConversion: Y != java.lang.Float) |
| ``` |
| |
| * 浮点数类型冲突 若使用 `%f` 等浮点格式说明符,但参数提供非数值类型(如字符串、布尔值),将触发类型转换错误 |
| |
| ```SQL |
| IoTDB:database1> select format('%.5f',status) from table1 where humidity = 35.4 |
| Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Invalid format string: %.5f (IllegalFormatConversion: f != java.lang.Boolean) |
| ``` |
| |
| 2. 参数数量不匹配错误 |
| |
| * 实际提供的参数数量 必须等于或大于 格式字符串中格式说明符的数量 |
| * 若参数数量少于格式说明符数量,将抛出 `ArgumentCountMismatch` 异常 |
| |
| ```SQL |
| IoTDB:database1> select format('%.5f %03d', humidity) from table1 where humidity = 35.4 |
| Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Invalid format string: %.5f %03d (MissingFormatArgument: Format specifier '%03d') |
| ``` |
| |
| 3. 无效调用错误 |
| |
| * 当函数参数满足以下任一条件时,视为非法调用: |
| * 参数总数 小于 2(必须包含格式字符串及至少一个参数) |
| * 格式字符串(`pattern`)类型非 `STRING/TEXT` |
| |
| ```SQL |
| -- 示例1 |
| IoTDB:database1> select format('%s') from table1 limit 1 |
| Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Scalar function format must have at least two arguments, and first argument pattern must be TEXT or STRING type. |
| |
| --示例2 |
| IoTDB:database1> select format(123, humidity) from table1 limit 1 |
| Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Scalar function format must have at least two arguments, and first argument pattern must be TEXT or STRING type. |
| ``` |
| |
| |
| |
| ## 8. 字符串函数和操作符 |
| |
| ### 8.1 字符串操作符 |
| |
| #### 8.1.1 || 操作符 |
| |
| `||` 操作符用于字符串连接,功能与 `concat` 函数相同。 |
| |
| #### 8.1.2 LIKE 语句 |
| |
| `LIKE` 语句用于模式匹配,具体用法在[模式匹配:LIKE](#1-like-运算符) 中有详细文档。 |
| |
| ### 8.2 字符串函数 |
| |
| | 函数名 | 描述 | 输入 | 输出 | 用法 | |
| | ----------- |---------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------ | ------------------------------------------------------------ | |
| | length | 返回字符串的字符长度,而不是字符数组的长度。 | 支持一个参数,类型可以是字符串或文本。**string**:要计算长度的字符串。 | INT32 | length(string) | |
| | upper | 将字符串中的字母转换为大写。 | 支持一个参数,类型可以是字符串或文本。**string**:要计算长度的字符串。 | String | upper(string) | |
| | lower | 将字符串中的字母转换为小写。 | 支持一个参数,类型可以是字符串或文本。**string**:要计算长度的字符串。 | String | lower(string) | |
| | trim | 从源字符串中删除指定的开头和/或结尾字符。 | 支持三个参数**specification(可选)**:指定从哪边去掉字符,可以是:`BOTH`:两边都去掉(默认)。`LEADING`:只去掉开头的字符。`TRAILING`:只去掉结尾的字符。**trimcharacter(可选)**:要去掉的字符,如果没指定,默认去掉空格。**string**:要处理的字符串。 | String | trim([ [ specification ] [ trimcharacter ] FROM ] string) 示例:`trim('!' FROM '!foo!');` —— `'foo'` | |
| | strpos | 返回子字符串在字符串中第一次出现的起始位置。位置从 1 开始计数。如果未找到,返回 0。注意:起始位置是基于字符而不是字节数组确定的。 | 仅支持两个参数,类型可以是字符串或文本。**sourceStr**:要搜索的字符串。**subStr**:要找的子字符串。 | INT32 | strpos(sourceStr, subStr) | |
| | starts_with | 测试子字符串是否是字符串的前缀。 | 支持两个参数,类型可以是字符串或文本。**sourceStr**:要检查的字符串,类型可以是字符串或文本。**prefix**:前缀子字符串,类型可以是字符串或文本。 | Boolean | starts_with(sourceStr, prefix) | |
| | ends_with | 测试字符串是否以指定的后缀结束。 | 支持两个参数,类型可以是字符串或文本。**sourceStr**:要检查的字符串。**suffix**:后缀子字符串。 | Boolean | ends_with(sourceStr, suffix) | |
| | concat | 返回字符串 `string1`、`string2`、...、`stringN` 的连接结果。功能与连接操作符 `\|\|` 相同。 | 至少两个参数,所有参数类型必须是字符串或文本。 | String | concat(str1, str2, ...) 或 str1 \|\| str2 ... | |
| | strcmp | 比较两个字符串的字母序。 | 支持两个参数,两个参数类型必须是字符串或文本。**string1**:第一个要比较的字符串。**string2**:第二个要比较的字符串。 | 返回一个整数值INT32如果 `str1 < str2`,返回 `-1`如果 `str1 = str2`,返回 `0`如果 `str1 > str2`,返回 `1`如果 `str1` 或 `str2` 为 `NULL`,返回 `NULL` | strcmp(str1, str2) | |
| | replace | 从字符串中删除所有 `search` 的实例。 | 支持两个参数,可以是字符串或文本类型。**string**:原始字符串,要从中删除内容的字符串。**search**:要删除的子字符串。 | String | replace(string, string) | |
| | replace | 将字符串中所有 `search` 的实例替换为 `replace`。 | 支持三个参数,可以是字符串或文本类型。**string**:原始字符串,要从中替换内容的字符串。**search**:要替换掉的子字符串。**replace**:用来替换的新字符串。 | String | replace(string, string, string) | |
| | substring | 从指定位置提取字符到字符串末尾。需要注意的是,起始位置是基于字符而不是字节数组确定的。`start_index` 从 1 开始计数,长度从 `start_index` 位置计算。 | 支持两个参数**string**:要提取子字符串的源字符串,可以是字符串或文本类型。**start_index**:从哪个索引开始提取子字符串,索引从 1 开始计数。 | String:返回一个字符串,从 `start_index` 位置开始到字符串末尾的所有字符。**注意事项**:`start_index` 从 1 开始,即数组的第 0 个位置是 1参数为 null时,返回 `null`start_index 大于字符串长度时,结果报错。 | substring(string from start_index)或 substring(string, start_index) | |
| | substring | 从一个字符串中提取从指定位置开始、指定长度的子字符串注意:起始位置和长度是基于字符而不是字节数组确定的。`start_index` 从 1 开始计数,长度从 `start_index` 位置计算。 | 支持三个参数**string**:要提取子字符串的源字符串,可以是字符串或文本类型。**start_index**:从哪个索引开始提取子字符串,索引从 1 开始计数。**length**:要提取的子字符串的长度。 | String:返回一个字符串,从 `start_index` 位置开始,提取 `length` 个字符。**注意事项**:参数为 null时,返回 `null`如果 `start_index` 大于字符串的长度,结果报错。如果 `length` 小于 0,结果报错。极端情况,`start_index + length` 超过 `int.MAX` 并变成负数,将导致异常结果。 | substring(string from start_index for length) 或 substring(string, start_index, length) | |
| |
| ## 9. 模式匹配函数 |
| |
| ### 9.1 LIKE 运算符 |
| |
| #### 9.1.1 用途 |
| |
| `LIKE` 运算符用于将值与模式进行比较。它通常用于 `WHERE` 子句中,用于匹配字符串中的特定模式。 |
| |
| #### 9.1.2 语法 |
| |
| ```SQL |
| ... column [NOT] LIKE 'pattern' ESCAPE 'character'; |
| ``` |
| |
| #### 9.1.3 匹配规则 |
| |
| - 匹配字符是区分大小写的。 |
| - 模式支持两个匹配符号: |
| - `_`:匹配任意单个字符。 |
| - `%`:匹配0个或多个字符。 |
| |
| #### 9.1.4 注意事项 |
| |
| - `LIKE` 模式匹配总是覆盖整个字符串。如果需要匹配字符串中的任意位置,模式必须以 `%` 开头和结尾。 |
| - 如果需要匹配 `%` 或 `_` 作为普通字符,必须使用转义字符。 |
| |
| #### 9.1.5 示例 |
| |
| 示例 1:匹配以特定字符开头的字符串 |
| |
| - **说明**:查找所有以字母 `E` 开头的名称,例如 `Europe`。 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE continent LIKE 'E%'; |
| ``` |
| |
| 示例 2:排除特定模式 |
| |
| - **说明**:查找所有不以字母 `E` 开头的名称。 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE continent NOT LIKE 'E%'; |
| ``` |
| |
| 示例 3:匹配特定长度的字符串 |
| |
| - **说明**:查找所有以 `A` 开头、以 `a` 结尾且中间有两个字符的名称,例如 `Asia`。 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE continent LIKE 'A__a'; |
| ``` |
| |
| 示例 4:转义特殊字符 |
| |
| - **说明**:查找所有以 `South_` 开头的名称。这里使用了转义字符 `\` 来转义 `_` 等特殊字符,例如`South_America`。 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE continent LIKE 'South\_%' ESCAPE '\'; |
| ``` |
| |
| 示例 5:匹配转义字符本身 |
| |
| - **说明**:如果需要匹配转义字符本身,可以使用双转义字符 `\\`。 |
| |
| ```SQL |
| SELECT * FROM table1 WHERE continent LIKE 'South\\%' ESCAPE '\'; |
| ``` |
| |
| ### 9.2 regexp_like 函数 |
| |
| #### 9.2.1 用途 |
| |
| `regexp_like` 函数用于评估正则表达式模式,并确定该模式是否包含在字符串中。 |
| |
| #### 9.2.2 语法 |
| |
| ```SQL |
| regexp_like(string, pattern); |
| ``` |
| |
| #### 9.2.3 注意事项 |
| |
| - `regexp_like` 的模式只需包含在字符串中,而不需要匹配整个字符串。 |
| - 如果需要匹配整个字符串,可以使用正则表达式的锚点 `^` 和 `$`。 |
| - `^` 表示“字符串的开头”,`$` 表示“字符串的结尾”。 |
| - 正则表达式采用 Java 定义的正则语法,但存在以下需要注意的例外情况: |
| - **多行模式** |
| 1. 启用方式:`(?m)`。 |
| 2. 只识别`\n`作为行终止符。 |
| 3. 不支持`(?d)`标志,且禁止使用。 |
| - **不区分大小写匹配** |
| 1. 启用方式:`(?i)`。 |
| 2. 基于Unicode规则,不支持上下文相关和本地化匹配。 |
| 3. 不支持`(?u)`标志,且禁止使用。 |
| - **字符类** |
| 1. 在字符类(如`[A-Z123]`)中,`\Q`和`\E`不被支持,被视为普通字面量。 |
| - **Unicode字符类(**`\p{prop}`**)** |
| 1. **名称下划线**:名称中的所有下划线必须删除(如`OldItalic`而非`Old_Italic`)。 |
| 2. **文字(Scripts)**:直接指定,无需`Is`、`script=`或`sc=`前缀(如`\p{Hiragana}`)。 |
| 3. **区块(Blocks)**:必须使用`In`前缀,不支持`block=`或`blk=`前缀(如`\p{InMongolian}`)。 |
| 4. **类别(Categories)**:直接指定,无需`Is`、`general_category=`或`gc=`前缀(如`\p{L}`)。 |
| 5. **二元属性(Binary Properties)**:直接指定,无需`Is`(如`\p{NoncharacterCodePoint}`)。 |
| |
| #### 9.2.4 示例 |
| |
| 示例 1:匹配包含特定模式的字符串 |
| |
| ```SQL |
| SELECT regexp_like('1a 2b 14m', '\\d+b'); -- true |
| ``` |
| |
| - **说明**:检查字符串 `'1a 2b 14m'` 是否包含模式 `\d+b`。 |
| - `\d+` 表示“一个或多个数字”。 |
| - `b` 表示字母 `b`。 |
| - 在 `'1a 2b 14m'` 中,`2b` 符合这个模式,所以返回 `true`。 |
| |
| 示例 2:匹配整个字符串 |
| |
| ```SQL |
| SELECT regexp_like('1a 2b 14m', '^\\d+b$'); -- false |
| ``` |
| |
| - **说明**:检查字符串 `'1a 2b 14m'` 是否完全匹配模式 `^\\d+b$`。 |
| - `\d+` 表示“一个或多个数字”。 |
| - `b` 表示字母 `b`。 |
| - `'1a 2b 14m'` 并不符合这个模式,因为它不是从数字开始,也不是以 `b` 结束,所以返回 `false`。 |
| |
| ## 10. 时序分窗函数 |
| |
| 原始示例数据如下: |
| |
| ```SQL |
| IoTDB> SELECT * FROM bid; |
| +-----------------------------+--------+-----+ |
| | time|stock_id|price| |
| +-----------------------------+--------+-----+ |
| |2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| |2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| |2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| |2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| |2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| +-----------------------------+--------+-----+ |
| |
| -- 创建语句 |
| CREATE TABLE bid(time TIMESTAMP TIME, stock_id STRING TAG, price FLOAT FIELD); |
| -- 插入数据 |
| INSERT INTO bid(time, stock_id, price) VALUES('2021-01-01T09:05:00','AAPL',100.0),('2021-01-01T09:06:00','TESL',200.0),('2021-01-01T09:07:00','AAPL',103.0),('2021-01-01T09:07:00','TESL',202.0),('2021-01-01T09:09:00','AAPL',102.0),('2021-01-01T09:15:00','TESL',195.0); |
| ``` |
| |
| ### 10.1 HOP |
| |
| #### 10.1.1 功能描述 |
| |
| HOP 函数用于按时间分段分窗分析,识别每一行数据所属的时间窗口。该函数通过指定固定窗口大小(size)和窗口滑动步长(SLIDE),将数据按时间戳分配到所有与其时间戳重叠的窗口中。若窗口之间存在重叠(步长 < 窗口大小),数据会自动复制到多个窗口。 |
| |
| #### 10.1.2 函数定义 |
| |
| ```SQL |
| HOP(data, timecol, size, slide[, origin]) |
| ``` |
| |
| #### 10.1.3 参数说明 |
| |
| | 参数名 | 参数类型 | 参数属性 | 描述 | |
| | --------- | ---------- | --------------------------------- | -------------------- | |
| | DATA | 表参数 | ROW SEMANTICPASS THROUGH | 输入表 | |
| | TIMECOL | 标量参数 | 字符串类型默认值:time | 时间列 | |
| | SIZE | 标量参数 | 长整数类型 | 窗口大小 | |
| | SLIDE | 标量参数 | 长整数类型 | 窗口滑动步长 | |
| | ORIGIN | 标量参数 | 时间戳类型默认值:Unix 纪元时间 | 第一个窗口起始时间 | |
| |
| #### 10.1.4 返回结果 |
| |
| HOP 函数的返回结果列包含: |
| |
| * window\_start: 窗口开始时间(闭区间) |
| * window\_end: 窗口结束时间(开区间) |
| * 映射列:DATA 参数的所有输入列 |
| |
| #### 10.1.5 使用示例 |
| |
| ```SQL |
| IoTDB> SELECT * FROM HOP(DATA => bid,TIMECOL => 'time',SLIDE => 5m,SIZE => 10m); |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| | window_start| window_end| time|stock_id|price| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:15:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:15:00.000+08:00|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:15:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:15:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:15:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:20:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:15:00.000+08:00|2021-01-01T09:25:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |
| -- 结合 GROUP BY 语句,等效于树模型的 GROUP BY TIME |
| IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM HOP(DATA => bid,TIMECOL => 'time',SLIDE => 5m,SIZE => 10m) GROUP BY window_start, window_end, stock_id; |
| +-----------------------------+-----------------------------+--------+------------------+ |
| | window_start| window_end|stock_id| avg| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00| TESL| 201.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL| 201.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:20:00.000+08:00| TESL| 195.0| |
| |2021-01-01T09:15:00.000+08:00|2021-01-01T09:25:00.000+08:00| TESL| 195.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00| AAPL|101.66666666666667| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:15:00.000+08:00| AAPL|101.66666666666667| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| ``` |
| |
| ### 10.2 SESSION |
| |
| #### 10.2.1 功能描述 |
| |
| SESSION 函数用于按会话间隔对数据进行分窗。系统逐行检查与前一行的时间间隔,小于阈值(GAP)则归入当前窗口,超过则归入下一个窗口。 |
| |
| #### 10.2.2 函数定义 |
| |
| ```SQL |
| SESSION(data [PARTITION BY(pkeys, ...)] [ORDER BY(okeys, ...)], timecol, gap) |
| ``` |
| #### 10.2.3 参数说明 |
| |
| | 参数名 | 参数类型 | 参数属性 | 描述 | |
| | --------- | ---------- | -------------------------- | ---------------------------------------- | |
| | DATA | 表参数 | SET SEMANTICPASS THROUGH | 输入表通过 pkeys、okeys 指定分区和排序 | |
| | TIMECOL | 标量参数 | 字符串类型默认值:'time' | 时间列名 |
| | |
| | GAP | 标量参数 | 长整数类型 | 会话间隔阈值 | |
| |
| #### 10.2.4 返回结果 |
| |
| SESSION 函数的返回结果列包含: |
| |
| * window\_start: 会话窗口内的第一条数据的时间 |
| * window\_end: 会话窗口内的最后一条数据的时间 |
| * 映射列:DATA 参数的所有输入列 |
| |
| #### 10.2.5 使用示例 |
| |
| ```SQL |
| IoTDB> SELECT * FROM SESSION(DATA => bid PARTITION BY stock_id ORDER BY time,TIMECOL => 'time',GAP => 2m); |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| | window_start| window_end| time|stock_id|price| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |2021-01-01T09:06:00.000+08:00|2021-01-01T09:07:00.000+08:00|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| |2021-01-01T09:06:00.000+08:00|2021-01-01T09:07:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| |2021-01-01T09:15:00.000+08:00|2021-01-01T09:15:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:09:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:09:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:09:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |
| -- 结合 GROUP BY 语句,等效于树模型的 GROUP BY SESSION |
| IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM SESSION(DATA => bid PARTITION BY stock_id ORDER BY time,TIMECOL => 'time',GAP => 2m) GROUP BY window_start, window_end, stock_id; |
| +-----------------------------+-----------------------------+--------+------------------+ |
| | window_start| window_end|stock_id| avg| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| |2021-01-01T09:06:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL| 201.0| |
| |2021-01-01T09:15:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL| 195.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|101.66666666666667| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| ``` |
| |
| ### 10.3 VARIATION |
| |
| #### 10.3.1 功能描述 |
| |
| VARIATION 函数用于按数据差值分窗,将第一条数据作为首个窗口的基准值,每个数据点会与基准值进行差值运算,如果差值小于给定的阈值(delta)则加入当前窗口;如果超过阈值,则分为下一个窗口,将该值作为下一个窗口的基准值。 |
| |
| #### 10.3.2 函数定义 |
| |
| ```sql |
| VARIATION(data [PARTITION BY(pkeys, ...)] [ORDER BY(okeys, ...)], col, delta) |
| ``` |
| |
| #### 10.3.3 参数说明 |
| |
| | 参数名 | 参数类型 | 参数属性 | 描述 | |
| | -------- | ---------- | -------------------------- | ---------------------------------------- | |
| | DATA | 表参数 | SET SEMANTICPASS THROUGH | 输入表通过 pkeys、okeys 指定分区和排序 | |
| | COL | 标量参数 | 字符串类型 | 标识对哪一列计算差值 | |
| | DELTA | 标量参数 | 浮点数类型 | 差值阈值 | |
| |
| #### 10.3.4 返回结果 |
| |
| VARIATION 函数的返回结果列包含: |
| |
| * window\_index: 窗口编号 |
| * 映射列:DATA 参数的所有输入列 |
| |
| #### 10.3.5 使用示例 |
| |
| ```sql |
| IoTDB> SELECT * FROM VARIATION(DATA => bid PARTITION BY stock_id ORDER BY time,COL => 'price',DELTA => 2.0); |
| +------------+-----------------------------+--------+-----+ |
| |window_index| time|stock_id|price| |
| +------------+-----------------------------+--------+-----+ |
| | 0|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| | 0|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| | 1|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| | 0|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| | 1|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| | 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| +------------+-----------------------------+--------+-----+ |
| |
| -- 结合 GROUP BY 语句,等效于树模型的 GROUP BY VARIATION |
| IoTDB> SELECT first(time) as window_start, last(time) as window_end, stock_id, avg(price) as avg FROM VARIATION(DATA => bid PARTITION BY stock_id ORDER BY time,COL => 'price', DELTA => 2.0) GROUP BY window_index, stock_id; |
| +-----------------------------+-----------------------------+--------+-----+ |
| | window_start| window_end|stock_id| avg| |
| +-----------------------------+-----------------------------+--------+-----+ |
| |2021-01-01T09:06:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|201.0| |
| |2021-01-01T09:15:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:07:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.5| |
| +-----------------------------+-----------------------------+--------+-----+ |
| ``` |
| |
| ### 10.4 CAPACITY |
| |
| #### 10.4.1 功能描述 |
| |
| CAPACITY 函数用于按数据点数(行数)分窗,每个窗口最多有 SIZE 行数据。 |
| |
| #### 10.4.2 函数定义 |
| |
| ```sql |
| CAPACITY(data [PARTITION BY(pkeys, ...)] [ORDER BY(okeys, ...)], size) |
| ``` |
| |
| #### 10.4.3 参数说明 |
| |
| | 参数名 | 参数类型 | 参数属性 | 描述 | |
| | -------- | ---------- | -------------------------- | ---------------------------------------- | |
| | DATA | 表参数 | SET SEMANTICPASS THROUGH | 输入表通过 pkeys、okeys 指定分区和排序 | |
| | SIZE | 标量参数 | 长整数类型 | 窗口大小 | |
| |
| #### 10.4.4 返回结果 |
| |
| CAPACITY 函数的返回结果列包含: |
| |
| * window\_index: 窗口编号 |
| * 映射列:DATA 参数的所有输入列 |
| |
| #### 10.4.5 使用示例 |
| |
| ```sql |
| IoTDB> SELECT * FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2); |
| +------------+-----------------------------+--------+-----+ |
| |window_index| time|stock_id|price| |
| +------------+-----------------------------+--------+-----+ |
| | 0|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| | 0|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| | 1|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| | 0|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| | 0|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| | 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| +------------+-----------------------------+--------+-----+ |
| |
| -- 结合 GROUP BY 语句,等效于树模型的 GROUP BY COUNT |
| IoTDB> SELECT first(time) as start_time, last(time) as end_time, stock_id, avg(price) as avg FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2) GROUP BY window_index, stock_id; |
| +-----------------------------+-----------------------------+--------+-----+ |
| | start_time| end_time|stock_id| avg| |
| +-----------------------------+-----------------------------+--------+-----+ |
| |2021-01-01T09:06:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|201.0| |
| |2021-01-01T09:15:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:05:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|101.5| |
| |2021-01-01T09:09:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| +-----------------------------+-----------------------------+--------+-----+ |
| ``` |
| |
| ### 10.5 TUMBLE |
| |
| #### 10.5.1 功能描述 |
| |
| TUMBLE 函数用于通过时间属性字段为每行数据分配一个窗口,滚动窗口的大小固定且不重复。 |
| |
| #### 10.5.2 函数定义 |
| |
| ```sql |
| TUMBLE(data, timecol, size[, origin]) |
| ``` |
| #### 10.5.3 参数说明 |
| |
| | 参数名 | 参数类型 | 参数属性 | 描述 | |
| | --------- | ---------- | --------------------------------- | -------------------- | |
| | DATA | 表参数 | ROW SEMANTICPASS THROUGH | 输入表 | |
| | TIMECOL | 标量参数 | 字符串类型默认值:time | 时间列 | |
| | SIZE | 标量参数 | 长整数类型 | 窗口大小,需为正数 | |
| | ORIGIN | 标量参数 | 时间戳类型默认值:Unix 纪元时间 | 第一个窗口起始时间 | |
| |
| #### 10.5.4 返回结果 |
| |
| TUBMLE 函数的返回结果列包含: |
| |
| * window\_start: 窗口开始时间(闭区间) |
| * window\_end: 窗口结束时间(开区间) |
| * 映射列:DATA 参数的所有输入列 |
| |
| #### 10.5.5 使用示例 |
| |
| ```SQL |
| IoTDB> SELECT * FROM TUMBLE( DATA => bid, TIMECOL => 'time', SIZE => 10m); |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| | window_start| window_end| time|stock_id|price| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:20:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |
| -- 结合 GROUP BY 语句,等效于树模型的 GROUP BY TIME |
| IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM TUMBLE(DATA => bid, TIMECOL => 'time', SIZE => 10m) GROUP BY window_start, window_end, stock_id; |
| +-----------------------------+-----------------------------+--------+------------------+ |
| | window_start| window_end|stock_id| avg| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00| TESL| 201.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:20:00.000+08:00| TESL| 195.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00| AAPL|101.66666666666667| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| ``` |
| |
| ### 10.6 CUMULATE |
| |
| #### 10.6.1 功能描述 |
| |
| Cumulate 函数用于从初始的窗口开始,创建相同窗口开始但窗口结束步长不同的窗口,直到达到最大的窗口大小。每个窗口包含其区间内的元素。例如:1小时步长,24小时大小的累计窗口,每天可以获得如下这些窗口:`[00:00, 01:00)`,`[00:00, 02:00)`,`[00:00, 03:00)`, …, `[00:00, 24:00)` |
| |
| #### 10.6.2 函数定义 |
| |
| ```sql |
| CUMULATE(data, timecol, size, step[, origin]) |
| ``` |
| |
| #### 10.6.3 参数说明 |
| |
| | 参数名 | 参数类型 | 参数属性 | 描述 | |
| | --------- | ---------- | --------------------------------- | -------------------------------------------- | |
| | DATA | 表参数 | ROW SEMANTICPASS THROUGH | 输入表 | |
| | TIMECOL | 标量参数 | 字符串类型默认值:time | 时间列 | |
| | SIZE | 标量参数 | 长整数类型 | 窗口大小,SIZE必须是STEP的整数倍,需为正数 | |
| | STEP | 标量参数 | 长整数类型 | 窗口步长,需为正数 | |
| | ORIGIN | 标量参数 | 时间戳类型默认值:Unix 纪元时间 | 第一个窗口起始时间 | |
| |
| > 注意:size 如果不是 step 的整数倍,则会报错`Cumulative table function requires size must be an integral multiple of step` |
| |
| #### 10.6.4 返回结果 |
| |
| CUMULATE函数的返回结果列包含: |
| |
| * window\_start: 窗口开始时间(闭区间) |
| * window\_end: 窗口结束时间(开区间) |
| * 映射列:DATA 参数的所有输入列 |
| |
| #### 10.6.5 使用示例 |
| |
| ```sql |
| IoTDB> SELECT * FROM CUMULATE(DATA => bid,TIMECOL => 'time',STEP => 2m,SIZE => 10m); |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| | window_start| window_end| time|stock_id|price| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:08:00.000+08:00|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:06:00.000+08:00| TESL|200.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:08:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:07:00.000+08:00| TESL|202.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:16:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:18:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:20:00.000+08:00|2021-01-01T09:15:00.000+08:00| TESL|195.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:06:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:08:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:05:00.000+08:00| AAPL|100.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:08:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|103.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| |
| +-----------------------------+-----------------------------+-----------------------------+--------+-----+ |
| |
| -- 结合 GROUP BY 语句,等效于树模型的 GROUP BY TIME |
| IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM CUMULATE(DATA => bid,TIMECOL => 'time',STEP => 2m, SIZE => 10m) GROUP BY window_start, window_end, stock_id; |
| +-----------------------------+-----------------------------+--------+------------------+ |
| | window_start| window_end|stock_id| avg| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:08:00.000+08:00| TESL| 201.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00| TESL| 201.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:16:00.000+08:00| TESL| 195.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:18:00.000+08:00| TESL| 195.0| |
| |2021-01-01T09:10:00.000+08:00|2021-01-01T09:20:00.000+08:00| TESL| 195.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:06:00.000+08:00| AAPL| 100.0| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:08:00.000+08:00| AAPL| 101.5| |
| |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00| AAPL|101.66666666666667| |
| +-----------------------------+-----------------------------+--------+------------------+ |
| ``` |