TDengine-数据操作

本章节目录

1 特点

  • TDengine采用传统的关系型数据库模型管理数据;
  • TDengine采用的是结构化存储,而不是NoSQL的key-value存储;
  • TDengine要求对每个数据采集点单独建表,用来存储这个采集点所采集的时序数据(无锁方式来写,追加的方式实现);
  • TDengine建议用数据采集点的名字来做表名,表的第一列必须是时间戳,即数据类型为 timestamp;
  • TDengine将自动按照时间戳建立索引,但对采集的物理量不建任何索引;
  • TDengine将数据用列式存储方式保存;
  • TDengine引入超级表,做采集点之间的聚合操作。
  • TDengine 针对的时序性结构化数据不提供删除功能,不提供数据删除的相关功能。
  • TDengine 对 SQL 语句中的英文字符不区分大小写,自动转化为小写执行。
  • 数据库名最大长度为 32。
  • 表名最大长度为 192,每行数据最大长度 16k 个字符(注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)。
  • 列名最大长度为 64,最多允许 1024 列,最少需要 2 列,第一列必须是时间戳。(从 2.1.7.0 版本开始,改为最多允许 4096 列)
  • 标签名最大长度为 64,最多允许 128 个,可以 1 个,一个表中标签值的总长度不超过 16k 个字符。
  • SQL 语句最大长度 65480 个字符,但可通过系统配置参数 maxSQLLength 修改,最长可配置为 1M。
  • SELECT 语句的查询结果,最多允许返回 1024 列(语句中的函数调用可能也会占用一些列空间),超限时需要显式指定较少的返回数据列,以避免语句执行报错。(从 2.1.7.0 版本开始,改为最多允许 4096 列)
  • 库的数目,超级表的数目、表的数目,系统不做限制,仅受系统资源限制。

2 数据类型

支持10中数据类型:

  • 插入记录时,如果时间戳为 now,插入数据时使用提交这条记录的客户端的当前时间
  • 时间可以加减,比如 now-2h,表明查询时刻向前推 2 个小时(最近 2 小时)。数字后面的时间单位可以是 b(纳秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小时)、d(天)、w(周)。 比如 select * from t1 where ts > now-2w and ts <= now-1w,表示查询两周前整整一周的数据。在指定降采样操作(down sampling)的时间窗口(interval)时,时间单位还可以使用 n(自然月) 和 y(自然年)。

3 数据建模

对于一个具体的应用场景,需要考虑库、超级表和普通表的设计。

3.1 库

TDengine建议将不同数据特征的表创建在不同的库里,因为每个库可以配置不同的存储策略。

  • 任何一张表或超级表是属于一个库的,在创建表之前,必须先创建库。
  • 处于两个不同库的表是不能进行JOIN操作的。
  • 创建并插入记录、查询历史记录的时候,均需要指定时间戳。

3.1.1 创建数据库

CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [DAYS days] [UPDATE 1];

说明:

  • KEEP是该数据库的数据保留多长天数,缺省是3650天(10年),数据库会自动删除超过时限的数据;
  • UPDATE 标志数据库支持更新相同时间戳数据;
  • 数据库名最大长度为33;
  • 一条SQL 语句的最大长度为65480个字符;
  • 数据库还有更多与存储相关的配置参数。

3.1.2 显示系统当前参数

SHOW VARIABLES;

3.1.3 使用数据库

USE db_name;

使用/切换数据库(在 RESTful 连接方式下无效)。

3.1.4 删除数据库

DROP DATABASE [IF EXISTS] db_name;

删除数据库。指定 Database 所包含的全部数据表将被删除,谨慎使用!

3.1.5 显示系统所有数据库

SHOW DATABASES;

3.1.6 显示一个数据库的创建语句

SHOW CREATE DATABASE db_name

常用于数据库迁移。对一个已经存在的数据库,返回其创建语句;在另一个集群中执行该语句,就能得到一个设置完全相同的 Database。

3.1.7 修改数据库参数

ALTER DATABASE db_name COMP 2;

COMP 参数是指修改数据库文件压缩标志位,缺省值为 2,取值范围为 [0, 2]。0 表示不压缩,1 表示一阶段压缩,2 表示两阶段压缩。

ALTER DATABASE db_name REPLICA 2;

REPLICA 参数是指修改数据库副本数,取值范围 [1, 3]。在集群中使用,副本数必须小于或等于 DNODE 的数目。

ALTER DATABASE db_name KEEP 365;

KEEP 参数是指修改数据文件保存的天数,缺省值为 3650,取值范围 [days, 365000],必须大于或等于 days 参数值。

ALTER DATABASE db_name QUORUM 2;

QUORUM 参数是指数据写入成功所需要的确认数,取值范围 [1, 2]。对于异步复制,quorum 设为 1,具有 master 角色的虚拟节点自己确认即可。对于同步复制,需要至少大于等于 2。原则上,Quorum >= 1 并且 Quorum <= replica(副本数),这个参数在启动一个同步模块实例时需要提供。

ALTER DATABASE db_name BLOCKS 100;

BLOCKS 参数是每个 VNODE (TSDB) 中有多少 cache 大小的内存块,因此一个 VNODE 的用的内存大小粗略为(cache * blocks)。取值范围 [3, 1000]。

ALTER DATABASE db_name CACHELAST 0;

CACHELAST 参数控制是否在内存中缓存子表的最近数据。缺省值为 0,取值范围 [0, 1, 2, 3]。其中 0 表示不缓存,1 表示缓存子表最近一行数据,2 表示缓存子表每一列的最近的非 NULL 值,3 表示同时打开缓存最近行和列功能。(从 2.0.11.0 版本开始支持参数值 [0, 1],从 2.1.2.0 版本开始支持参数值 [0, 1, 2, 3]。)

说明:缓存最近行,将显著改善 LAST_ROW 函数的性能表现;缓存每列的最近非 NULL 值,将显著改善无特殊影响(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函数的性能表现。

3.2 表

创建时,需要使用超级表做模板,同时指定标签的具体值。

3.2.1 创建数据表

CREATE TABLE [IF NOT EXISTS] tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...]);
  • 表的第一个字段必须是 TIMESTAMP,并且系统自动将其设为主键;
  • 表名最大长度为 192;
  • 表的每行长度不能超过 16k 个字符;(注意:每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
  • 子表名只能由字母、数字和下划线组成,且不能以数字开头
  • 使用数据类型 binary 或 nchar,需指定其最长的字节数,如 binary(20),表示 20 字节;

3.2.2 以超级表为模板创建数据表

CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name TAGS (tag_value1, ...);

以指定的超级表为模板,指定 TAGS 的值来创建数据表。

3.2.3 以超级表为模板创建数据表,并指定具体的 TAGS 列

CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name (tag_name1, ...) TAGS (tag_value1, ...);

以指定的超级表为模板,指定一部分 TAGS 列的值来创建数据表(没被指定的 TAGS 列会设为空值)。

说明:从 2.0.17.0 版本开始支持这种方式。在之前的版本中,不允许指定 TAGS 列,而必须显式给出所有 TAGS 列的取值。

3.2.4 批量创建数据表

CREATE TABLE [IF NOT EXISTS] tb_name1 USING stb_name TAGS (tag_value1, ...) [IF NOT EXISTS] tb_name2 USING stb_name TAGS (tag_value2, ...) ...;

以更快的速度批量创建大量数据表(服务器端 2.0.14 及以上版本)。

  • 批量建表方式要求数据表必须以超级表为模板。
  • 在不超出 SQL 语句长度限制的前提下,单条语句中的建表数量建议控制在 1000~3000 之间,将会获得比较理想的建表速度。

3.2.5 删除数据表

DROP TABLE [IF EXISTS] tb_name;

3.2.6 显示当前数据库下的所有数据表信息

SHOW TABLES [LIKE tb_name_wildcar];

显示当前数据库下的所有数据表信息。

3.2.7 显示一个数据表的创建语句

SHOW CREATE TABLE tb_name;

常用于数据库迁移。对一个已经存在的数据表,返回其创建语句;在另一个集群中执行该语句,就能得到一个结构完全相同的数据表。

3.2.8 在线修改显示字符宽度

SET MAX_BINARY_DISPLAY_WIDTH <nn>;

如显示的内容后面以…结尾时,表示该内容已被截断,可通过本命令修改显示字符宽度以显示完整的内容。

3.2.9 获取表的结构信息

DESCRIBE tb_name;

3.2.10 表增加列

ALTER TABLE tb_name DROP COLUMN field_name; 
  • 列的最大个数为1024,最小个数为2;(从 2.1.7.0 版本开始,改为最多允许 4096 列)
  • 列名最大长度为64。

3.2.11 表删除列

ALTER TABLE tb_name DROP COLUMN field_name; 

如果表是通过超级表创建,更改表结构的操作只能对超级表进行。同时针对超级表的结构更改对所有通过该结构创建的表生效。对于不是通过超级表创建的表,可以直接修改表结构。

3.2.12 表修改列宽

ALTER TABLE tb_name MODIFY COLUMN field_name data_type(length); 

如果数据列的类型是可变长格式(BINARY 或 NCHAR),那么可以使用此指令修改其宽度(只能改大,不能改小)。(2.1.3.0 版本新增)

如果表是通过超级表创建,更改表结构的操作只能对超级表进行。同时针对超级表的结构更改对所有通过该结构创建的表生效。对于不是通过超级表创建的表,可以直接修改表结构。

3.3 超级表

为便于多表之间的聚合,使用TDengine, 需要对每个类型的数据采集点创建一个超级表。

3.3.1 创建超级表

CREATE STABLE [IF NOT EXISTS] stb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...]) TAGS (tag1_name tag_type1, tag2_name tag_type2 [, tag3_name tag_type3]);

创建 STable,与创建表的 SQL 语法相似,但需要指定 TAGS 字段的名称和类型。

  • TAGS 列的数据类型不能是 timestamp 类型;(从 2.1.3.0 版本开始,TAGS 列中支持使用 timestamp 类型,但需注意在 TAGS 中的 timestamp 列写入数据时需要提供给定值,而暂不支持四则运算,例如 NOW + 10s 这类表达式)
  • TAGS 列名不能与其他列名相同;
  • TAGS 列名不能为预留关键字(参见:参数限制与保留关键字 章节);
  • TAGS 最多允许 128 个,至少 1 个,总长度不超过 16 KB。

3.3.2 删除超级表

DROP STABLE [IF EXISTS] stb_name;

删除 STable 会自动删除通过 STable 创建的子表。

3.3.3 显示当前数据库下的所有超级表信息

SHOW STABLES [LIKE tb_name_wildcard];

查看数据库内全部 STable,及其相关信息,包括 STable 的名称、创建时间、列数量、标签(TAG)数量、通过该 STable 建表的数量。

3.3.4 显示一个超级表的创建语句

SHOW CREATE STABLE stb_name;

常用于数据库迁移。对一个已经存在的超级表,返回其创建语句;在另一个集群中执行该语句,就能得到一个结构完全相同的超级表。

3.3.5 获取超级表的结构信息

DESCRIBE stb_name;

3.3.6 超级表增加列

ALTER STABLE stb_name ADD COLUMN field_name data_type;

3.3.7 超级表删除列

ALTER STABLE stb_name DROP COLUMN field_name; 

3.3.8 超级表修改列宽

ALTER STABLE stb_name MODIFY COLUMN field_name data_type(length); 

如果数据列的类型是可变长格式(BINARY 或 NCHAR),那么可以使用此指令修改其宽度(只能改大,不能改小)。(2.1.3.0 版本新增)

3.3.9 TAG管理

3.3.9.1 添加标签
ALTER STABLE stb_name ADD TAG new_tag_name tag_type;

为 STable 增加一个新的标签,并指定新标签的类型。标签总数不能超过 128 个,总长度不超过 16k 个字符。

3.3.9.2 删除标签
ALTER STABLE stb_name DROP TAG tag_name;

删除超级表的一个标签,从超级表删除某个标签后,该超级表下的所有子表也会自动删除该标签。

3.3.9.3 修改标签名
ALTER STABLE stb_name CHANGE TAG old_tag_name new_tag_name;

修改超级表的标签名,从超级表修改某个标签名后,该超级表下的所有子表也会自动更新该标签名。

3.3.9.4 修改标签列宽度
ALTER STABLE stb_name MODIFY TAG tag_name data_type(length); 

如果标签的类型是可变长格式(BINARY 或 NCHAR),那么可以使用此指令修改其宽度(只能改大,不能改小)。(2.1.3.0 版本新增)

3.3.9.5 修改子表标签值
ALTER TABLE tb_name SET TAG tag_name=new_tag_value;

说明:除了更新标签的值的操作是针对子表进行,其他所有的标签操作(添加标签、删除标签等)均只能作用于 STable,不能对单个子表操作。对 STable 添加标签以后,依托于该 STable 建立的所有表将自动增加了一个标签,所有新增标签的默认值都是 NULL。

4 数据操作

4.1 插入INSERT

INSERT INTO
    tb_name
        [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
        [(field1_name, ...)]
        VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
    [tb2_name
        [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
        [(field1_name, ...)]
        VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
    ...];
  • insert多条记录时,不能把第一列的时间戳取值都设为 NOW,否则会导致语句中的多条记录使用相同的时间戳,于是就可能出现相互覆盖以致这些数据行无法全部被正确保存。
  • insert采用的流式解析策略,在发现后面的错误之前,前面正确的部分 SQL 仍会执行。

4.1.1 插入一条或多条记录

指定已经创建好的数据子表的表名,并通过 VALUES 关键字提供一行或多行数据:

INSERT INTO d1001 VALUES (NOW, 10.2, 219, 0.32);

或者,可以通过如下语句写入两行记录:

INSERT INTO d1001 VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32) (1626164208000, 10.15, 217, 0.33);

4.1.2 插入记录,数据对应到指定的列

向数据子表中插入记录时,无论插入一行还是多行,都可以让数据对应到指定的列。对于 SQL 语句中没有出现的列,数据库将自动填充为 NULL。主键(时间戳)不能为 NULL。

INSERT INTO d1001 (ts, current, phase) VALUES ('2021-07-13 14:06:33.196', 10.27, 0.31);

说明:如果不指定列,也即使用全列模式——那么在 VALUES 部分提供的数据,必须为数据表的每个列都显式地提供数据。全列模式写入速度会远快于指定列,因此建议尽可能采用全列写入方式,此时空列可以填入 NULL。

4.1.3 向多个表插入记录

可以在一条语句中,分别向多个表插入一条或多条记录,并且也可以在插入过程中指定列。例如:

INSERT INTO d1001 VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
            d1002 (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);

4.1.4 插入记录时自动建表

如果用户在写数据时并不确定某个表是否存在,此时可以在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。自动建表时,要求必须以超级表为模板,并写明数据表的 TAGS 取值。例如:

INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32);

也可以在自动建表时,只是指定部分 TAGS 列的取值,未被指定的 TAGS 列将置为 NULL。例如:

INSERT INTO d21001 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33);

自动建表语法也支持在一条语句中向多个表插入记录。例如:

INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
            d21002 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:34.255', 10.15, 217, 0.33)
            d21003 USING meters (groupId) TAGS (2) (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);

4.1.5 插入来自文件的数据记录

除了使用 VALUES 关键字插入一行或多行数据外,也可以把要写入的数据放在 CSV 文件中(英文逗号分隔、英文单引号括住每个值)供 SQL 指令读取。其中 CSV 文件无需表头。例如,如果 /tmp/csvfile.csv 文件的内容为:

'2021-07-13 14:07:34.630', '10.2', '219', '0.32'
'2021-07-13 14:07:35.779', '10.15', '217', '0.33'

那么通过如下指令可以把这个文件中的数据写入子表中:

INSERT INTO d1001 FILE '/tmp/csvfile.csv';

4.1.6 插入来自文件的数据记录,并自动建表

从 2.1.5.0 版本开始,支持在插入来自 CSV 文件的数据时,以超级表为模板来自动创建不存在的数据表。例如:

INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) FILE '/tmp/csvfile.csv';

也可以在一条语句中向多个表以自动建表的方式插入记录。例如:

INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) FILE '/tmp/csvfile_21001.csv'
            d21002 USING meters (groupId) TAGS (2) FILE '/tmp/csvfile_21002.csv';

历史记录写入:可使用IMPORT或者INSERT命令,IMPORT的语法,功能与INSERT完全一样。

4.2 查询SELECT

SELECT select_expr [, select_expr ...]
    FROM {tb_name_list}
    [WHERE where_condition]
    [SESSION(ts_col, tol_val)]
    [STATE_WINDOW(col)]
    [INTERVAL(interval_val [, interval_offset]) [SLIDING sliding_val]]
    [FILL(fill_mod_and_val)]
    [GROUP BY col_list]
    [ORDER BY col_list { DESC | ASC }]
    [SLIMIT limit_val [SOFFSET offset_val]]
    [LIMIT limit_val [OFFSET offset_val]]
    [>> export_file];

4.2.1 通配符

  • 通配符 * 可以用于代指全部列。对于普通表,结果中只有普通列,不包含标签列。
  • 在针对超级表,通配符包含 标签列 。
SELECT * FROM d1001;
SELECT d1001.* FROM d1001;
  • 在JOIN查询中,带前缀的*和不带前缀*返回的结果有差别, *返回全部表的所有列数据(不包含标签),带前缀的通配符,则只返回该表的列数据。
  • 在使用SQL函数来进行查询的过程中,部分SQL函数支持通配符操作。其中的区别在于: count(*)函数只返回一列。first、last、last_row函数则是返回全部列。

4.2.2 标签列

  • 支持在普通表的查询中指定 标签列,且标签列的值会与普通列的数据一起返回。
  • 支持在超级表查询标签列时,指定 DISTINCT 关键字,这样将返回指定标签列的所有不重复取值。
SELECT DISTINCT tag_name FROM stb_name;

注意:目前 DISTINCT 关键字只支持对超级表的标签列进行去重,而不能用于普通列。

4.2.3 结果集列名

SELECT子句中,如果不指定返回结果集合的列名,结果集列名称默认使用SELECT子句中的表达式名称作为列名称。此外,用户可使用AS来重命名返回结果集合中列的名称。

但是针对first(*)、last(*)、last_row(*)不支持针对单列的重命名。

4.2.4 隐式结果列

Select_exprs可以是表所属列的列名,也可以是基于列的函数表达式或计算式,数量的上限256个。当用户使用了interval或group by tags的子句以后,在最后返回结果中会强制返回时间戳列(第一列)和group by子句中的标签列。后续的版本中可以支持关闭group by子句中隐式列的输出,列输出完全由select子句控制。

4.2.5 当前所在的数据库

获取当前所在的数据库:

SELECT DATABASE();

如果登录的时候没有指定默认数据库,且没有使用USE命令切换数据,则返回NULL。

4.2.6 获取服务器和客户端版本号:

taos> SELECT CLIENT_VERSION();
taos> SELECT SERVER_VERSION();

4.2.7 服务器状态检测语句。

如果服务器正常,返回一个数字(例如 1)。如果服务器异常,返回error code。该SQL语法能兼容连接池对于TDengine状态的检查及第三方工具对于数据库服务器状态的检查。并可以避免出现使用了错误的心跳检测SQL语句导致的连接池连接丢失的问题。

taos> SELECT SERVER_STATUS();
taos> SELECT SERVER_STATUS() AS status;

4.2.8 获取一个超级表所有的子表名及相关的标签信息

SELECT TBNAME, location FROM meters;

4.2.9 统计超级表下辖子表数量

SELECT COUNT(TBNAME) FROM meters;

4.3 嵌套查询

SELECT ... FROM (SELECT ... FROM ...) ...;

4.4 UNION ALL

SELECT ...
UNION ALL SELECT ...
[UNION ALL SELECT ...]
  • 如果多个 SELECT 子句返回结果集的结构完全相同(列名、列类型、列数、顺序),那么可以通过 UNION ALL 把这些结果集合并到一起。
  • 目前只支持 UNION ALL 模式,也即在结果集的合并过程中是不去重的。

4.5 SQL函数

4.5.1 聚合函数

4.5.1.1 COUNT:非空值个数
SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];
  • 功能说明:统计表/超级表中记录行数或某列的非空值个数。
  • 返回结果数据类型:长整型INT64。
  • 应用字段:应用全部字段。
  • 适用于:表、超级表。

说明:

  • 可以使用星号(*)来替代具体的字段,使用星号(*)返回全部记录数量。
  • 针对同一表的(不包含NULL值)字段查询结果均相同。
  • 如果统计对象是具体的列,则返回该列中非NULL值的记录数量。
4.5.1.2 AVG:均值
SELECT AVG(field_name) FROM tb_name [WHERE clause];
  • 功能说明:统计表/超级表中某列的平均值。
  • 返回结果数据类型:双精度浮点数Double。
  • 应用字段:不能应用在timestamp、binary、nchar、bool字段。
  • 适用于:表、超级表。
4.5.1.3 TWA:时间加权平均函数
SELECT TWA(field_name) FROM tb_name WHERE clause;
  • 功能说明:时间加权平均函数。统计表中某列在一段时间内的时间加权平均。
  • 返回结果数据类型:双精度浮点数Double。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、(超级表)。
4.5.1.4 IRATE:瞬时增长率
SELECT IRATE(field_name) FROM tb_name WHERE clause;
  • 功能说明:计算瞬时增长率。使用时间区间中最后两个样本数据来计算瞬时增长速率;如果这两个值呈递减关系,那么只取最后一个数用于计算,而不是使用二者差值。
  • 返回结果数据类型:双精度浮点数Double。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、(超级表)。
4.5.1.5 SUM:某列的和
SELECT SUM(field_name) FROM tb_name [WHERE clause];
  • 功能说明:统计表/超级表中某列的和。
  • 返回结果数据类型:双精度浮点数Double和长整型INT64。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、超级表。
4.5.1.6 STDDEV:某列的均方差
SELECT STDDEV(field_name) FROM tb_name [WHERE clause];
  • 功能说明:统计表中某列的均方差。
  • 返回结果数据类型:双精度浮点数Double。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表。(从 2.0.15.1 版本开始,本函数也支持超级表)
4.5.1.7 LEASTSQUARES:拟合直线方程
SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause];

功能说明:统计表中某列的值是主键(时间戳)的拟合直线方程。start_val是自变量初始值,step_val是自变量的步长值。

  • 返回结果数据类型:字符串表达式(斜率, 截距)。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 说明:自变量是时间戳,因变量是该列的值。
  • 适用于:表。

4.5.2 选择函数

4.5.2.1 MIN:最小值
SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];
  • 功能说明:统计表/超级表中某列的值最小值。
  • 返回结果数据类型:同应用的字段。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、超级表。
4.5.2.2 MAX:最大值
SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause];
  • 功能说明:统计表/超级表中某列的值最大值。
  • 返回结果数据类型:同应用的字段。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、超级表。
4.5.2.3 FIRST:最先写入的非NULL值
SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];
  • 功能说明:统计表/超级表中某列的值最先写入的非NULL值。
  • 返回结果数据类型:同应用的字段。
  • 应用字段:所有字段。
  • 适用于:表、超级表。

说明:

  • 如果要返回各个列的首个(时间戳最小)非NULL值,可以使用FIRST(*);
  • 如果结果集中的某列全部为NULL值,则该列的返回结果也是NULL;
  • 如果结果集中所有列全部为NULL值,则不返回结果。
4.5.2.4 LAST:最后写入的非 NULL 值
SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause];
  • 功能说明:统计表/超级表中某列的值最后写入的非 NULL 值。
  • 返回结果数据类型:同应用的字段。
  • 应用字段:所有字段。
  • 适用于:表、超级表。

说明:

  • 如果要返回各个列的最后(时间戳最大)一个非 NULL 值,可以使用 LAST(*);
  • 如果结果集中的某列全部为 NULL 值,则该列的返回结果也是 NULL;如果结果集中所有列全部为 NULL 值,则不返回结果。
  • 在用于超级表时,时间戳完全一样且同为最大的数据行可能有多个,那么会从中随机返回一条,而并不保证多次运行所挑选的数据行必然一致。
4.5.2.5 TOP:最大K个
SELECT TOP(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
  • 功能说明: 统计表/超级表中某列的值最大 k 个非 NULL 值。如果多条数据取值一样,全部取用又会超出 k 条限制时,系统会从相同值中随机选取符合要求的数量返回。
  • 返回结果数据类型:同应用的字段。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、超级表。

说明:

  • k值取值范围1≤k≤100;
  • 系统同时返回该记录关联的时间戳列;
  • 限制:TOP函数不支持FILL子句。
4.5.2.6 BOTTOM:最小K个
SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
  • 功能说明:统计表/超级表中某列的值最小 k 个非 NULL 值。如果多条数据取值一样,全部取用又会超出 k 条限制时,系统会从相同值中随机选取符合要求的数量返回。
  • 返回结果数据类型:同应用的字段。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、超级表。

说明:

  • k值取值范围1≤k≤100;
  • 系统同时返回该记录关联的时间戳列;
  • 限制:BOTTOM函数不支持FILL子句。
4.5.2.7 PERCENTILE:统计表中某列的值百分比分位数
SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];
  • 功能说明:统计表中某列的值百分比分位数。
  • 返回结果数据类型: 双精度浮点数Double。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表。
  • 说明:P值取值范围0≤P≤100,为0的时候等同于MIN,为100的时候等同于MAX。
4.5.2.8 LAST_ROW:最后一条记录
SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };
  • 功能说明:返回表/超级表的最后一条记录。
  • 返回结果数据类型:同应用的字段。
  • 应用字段:所有字段。
  • 适用于:表、超级表。
  • 限制:LAST_ROW() 不能与 INTERVAL 一起使用。
  • 说明:在用于超级表时,时间戳完全一样且同为最大的数据行可能有多个,那么会从中随机返回一条,而并不保证多次运行所挑选的数据行必然一致。

4.5.3 计算函数

4.5.3.1 DIFF:某列的值与前一行对应值的差
SELECT DIFF(field_name) FROM tb_name [WHERE clause];
  • 功能说明:统计表中某列的值与前一行对应值的差。
  • 返回结果数据类型:同应用字段。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、(超级表)。
  • 说明:输出结果行数是范围内总行数减一,第一行没有结果输出。从 2.1.3.0 版本开始,DIFF 函数可以在由 GROUP BY 划分出单独时间线的情况下用于超级表(也即 GROUP BY tbname)。
4.5.3.2 DERIVATIVE:某列数值的单位变化率
SELECT DERIVATIVE(field_name, time_interval, ignore_negative) FROM tb_name [WHERE clause];
  • 功能说明:统计表中某列数值的单位变化率。其中单位时间区间的长度可以通过 time_interval 参数指定,最小可以是 1 秒(1s);ignore_negative 参数的值可以是 0 或 1,为 1 时表示忽略负值。
  • 返回结果数据类型:双精度浮点数。
  • 应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
  • 适用于:表、(超级表)。
  • 说明:(从 2.1.3.0 版本开始新增此函数)输出结果行数是范围内总行数减一,第一行没有结果输出。DERIVATIVE 函数可以在由 GROUP BY 划分出单独时间线的情况下用于超级表(也即 GROUP BY tbname)。
4.5.3.3 SPREAD:某列的最大值和最小值之差
SELECT SPREAD(field_name) FROM { tb_name | stb_name } [WHERE clause];
  • 功能说明:统计表/超级表中某列的最大值和最小值之差。
  • 返回结果数据类型:双精度浮点数。
  • 应用字段:不能应用在binary、nchar、bool类型字段。
  • 适用于:表、超级表。
  • 说明:可用于TIMESTAMP字段,此时表示记录的时间覆盖范围。
4.5.3.4 四则运算
SELECT field_name [+|-|*|/|%][Value|field_name] FROM { tb_name | stb_name }  [WHERE clause];
  • 功能说明:统计表/超级表中某列或多列间的值加、减、乘、除、取余计算结果。
  • 返回结果数据类型:双精度浮点数。
  • 应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
  • 适用于:表、超级表。

说明:

  • 支持两列或多列之间进行计算,可使用括号控制计算优先级;
  • NULL字段不参与计算,如果参与计算的某行中包含NULL,该行的计算结果为NULL。

发表评论

您的电子邮箱地址不会被公开。