SQL 函数
聚合函数
TDengine 支持针对数据的聚合查询。提供支持的聚合和选择函数如下:
COUNT
SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];
功能说明:统计表/超级表中记录行数或某列的非空值个数。
返回数据类型:长整型 INT64。
应用字段:应用全部字段。
适用于:表、超级表。
使用说明:
- 可以使用星号(*)来替代具体的字段,使用星号(*)返回全部记录数量。
- 针对同一表的(不包含 NULL 值)字段查询结果均相同。
- 如果统计对象是具体的列,则返回该列中非 NULL 值的记录数量。
示例:
taos> SELECT COUNT(*), COUNT(voltage) FROM meters;
count(*) | count(voltage) |
================================================
9 | 9 |
Query OK, 1 row(s) in set (0.004475s)
taos> SELECT COUNT(*), COUNT(voltage) FROM d1001;
count(*) | count(voltage) |
================================================
3 | 3 |
Query OK, 1 row(s) in set (0.001075s)
AVG
SELECT AVG(field_name) FROM tb_name [WHERE clause];
功能说明:统计表/超级表中某列的平均值。
返回数据类型:双精度浮点数 Double。
应用字段:不能应用在 timestamp、binary、nchar、bool 字段。
适用于:表、超级表。
示例:
taos> SELECT AVG(current), AVG(voltage), AVG(phase) FROM meters;
avg(current) | avg(voltage) | avg(phase) |
====================================================================================
11.466666751 | 220.444444444 | 0.293333333 |
Query OK, 1 row(s) in set (0.004135s)
taos> SELECT AVG(current), AVG(voltage), AVG(phase) FROM d1001;
avg(current) | avg(voltage) | avg(phase) |
====================================================================================
11.733333588 | 219.333333333 | 0.316666673 |
Query OK, 1 row(s) in set (0.000943s)
TWA
SELECT TWA(field_name) FROM tb_name WHERE clause;
功能说明:时间加权平均函数。统计表中某列在一段时间内的时间加权平均。
返回数据类型:双精度浮点数 Double。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表、超级表。
使用说明:
- 从 2.1.3.0 版本开始,TWA 函数可以在由 GROUP BY 划分出单独时间线的情况下用于超级表(也即 GROUP BY tbname)。
IRATE
SELECT IRATE(field_name) FROM tb_name WHERE clause;
功能说明:计算瞬时增长率。使用时间区间中最后两个样本数据来计算瞬时增长速率;如果这两个值呈递减关系,那么只取最后一个数用于计算,而不是使用二者差值。
返回数据类型:双精度浮点数 Double。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表、超级表。
使用说明:
- 从 2.1.3.0 版本开始此函数可用,IRATE 可以在由 GROUP BY 划分出单独时间线的情况下用于超级表(也即 GROUP BY tbname)。
SUM
SELECT SUM(field_name) FROM tb_name [WHERE clause];
功能说明:统计表/超级表中某列的和。
返回数据类型:双精度浮点数 Double 和长整型 INT64。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表、超级表。
示例:
taos> SELECT SUM(current), SUM(voltage), SUM(phase) FROM meters;
sum(current) | sum(voltage) | sum(phase) |
================================================================================
103.200000763 | 1984 | 2.640000001 |
Query OK, 1 row(s) in set (0.001702s)
taos> SELECT SUM(current), SUM(voltage), SUM(phase) FROM d1001;
sum(current) | sum(voltage) | sum(phase) |
================================================================================
35.200000763 | 658 | 0.950000018 |
Query OK, 1 row(s) in set (0.000980s)
STDDEV
SELECT STDDEV(field_name) FROM tb_name [WHERE clause];
功能说明:统计表中某列的均方差。
返回数据类型:双精度浮点数 Double。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表、超级表(从 2.0.15.1 版本开始)
示例:
taos> SELECT STDDEV(current) FROM d1001;
stddev(current) |
============================
1.020892909 |
Query OK, 1 row(s) in set (0.000915s)
LEASTSQUARES
SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause];
功能说明:统计表中某列的值是主键(时间戳)的拟合直线方程。start_val 是自变量初始值,step_val 是自变量的步长值。
返回数据类型:字符串表达式(斜率, 截距)。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表。
示例:
taos> SELECT LEASTSQUARES(current, 1, 1) FROM d1001;
leastsquares(current, 1, 1) |
=====================================================
{slop:1.000000, intercept:9.733334} |
Query OK, 1 row(s) in set (0.000921s)
选择函数
在使用所有的选择函数的时候,可以同时指定输出 ts 列或标签列(包括 tbname),这样就可以方便地知道被选出的值是源于哪个数据行的。
MIN
SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];
功能说明:统计表/超级表中某列的值最小值。
返回数据类型:同应用的字段。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表、超级表。
示例:
taos> SELECT MIN(current), MIN(voltage) FROM meters;
min(current) | min(voltage) |
======================================
10.20000 | 218 |
Query OK, 1 row(s) in set (0.001765s)
taos> SELECT MIN(current), MIN(voltage) FROM d1001;
min(current) | min(voltage) |
======================================
10.30000 | 218 |
Query OK, 1 row(s) in set (0.000950s)
MAX
SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause];
功能说明:统计表/超级表中某列的值最大值。
返回数据类型:同应用的字段。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表、超级表。
示例:
taos> SELECT MAX(current), MAX(voltage) FROM meters;
max(current) | max(voltage) |
======================================
13.40000 | 223 |
Query OK, 1 row(s) in set (0.001123s)
taos> SELECT MAX(current), MAX(voltage) FROM d1001;
max(current) | max(voltage) |
======================================
12.60000 | 221 |
Query OK, 1 row(s) in set (0.000987s)
FIRST
SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];
功能说明:统计表/超级表中某列的值最先写入的非 NULL 值。
返回数据类型:同应用的字段。
应用字段:所有字段。
适用于:表、超级表。
使用说明:
- 如果要返回各个列的首个(时间戳最小)非 NULL 值,可以使用 FIRST(*);
- 如果结果集中的某列全部为 NULL 值,则该列的返回结果也是 NULL;
- 如果结果集中所有列全部为 NULL 值,则不返回结果。
示例:
taos> SELECT FIRST(*) FROM meters;
first(ts) | first(current) | first(voltage) | first(phase) |
=========================================================================================
2018-10-03 14:38:04.000 | 10.20000 | 220 | 0.23000 |
Query OK, 1 row(s) in set (0.004767s)
taos> SELECT FIRST(current) FROM d1002;
first(current) |
=======================
10.20000 |
Query OK, 1 row(s) in set (0.001023s)
LAST
SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause];
功能说明:统计表/超级表中某列的值最后写入的非 NULL 值。
返回数据类型:同应用的字段。
应用字段:所有字段。
适用于:表、超级表。
使用说明:
- 如果要返回各个列的最后(时间戳最大)一个非 NULL 值,可以使用 LAST(*);
- 如果结果集中的某列全部为 NULL 值,则该列的返回结果也是 NULL;如果结果集中所有列全部为 NULL 值,则不返回结果。
- 在用于超级表时,时间戳完全一样且同为最大的数据行可能有多个,那么会从中随机返回一条,而并不保证多次运行所挑选的 数据行必然一致。
示例:
taos> SELECT LAST(*) FROM meters;
last(ts) | last(current) | last(voltage) | last(phase) |
========================================================================================
2018-10-03 14:38:16.800 | 12.30000 | 221 | 0.31000 |
Query OK, 1 row(s) in set (0.001452s)
taos> SELECT LAST(current) FROM d1002;
last(current) |
=======================
10.30000 |
Query OK, 1 row(s) in set (0.000843s)
TOP
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 子句。
示例:
taos> SELECT TOP(current, 3) FROM meters;
ts | top(current, 3) |
=================================================
2018-10-03 14:38:15.000 | 12.60000 |
2018-10-03 14:38:16.600 | 13.40000 |
2018-10-03 14:38:16.800 | 12.30000 |
Query OK, 3 row(s) in set (0.001548s)
taos> SELECT TOP(current, 2) FROM d1001;
ts | top(current, 2) |
=================================================
2018-10-03 14:38:15.000 | 12.60000 |
2018-10-03 14:38:16.800 | 12.30000 |
Query OK, 2 row(s) in set (0.000810s)
BOTTOM
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 子句。
示例:
taos> SELECT BOTTOM(voltage, 2) FROM meters;
ts | bottom(voltage, 2) |
===============================================
2018-10-03 14:38:15.000 | 218 |
2018-10-03 14:38:16.650 | 218 |
Query OK, 2 row(s) in set (0.001332s)
taos> SELECT BOTTOM(current, 2) FROM d1001;
ts | bottom(current, 2) |
=================================================
2018-10-03 14:38:05.000 | 10.30000 |
2018-10-03 14:38:16.800 | 12.30000 |
Query OK, 2 row(s) in set (0.000793s)
PERCENTILE
SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];
功能说明:统计表中某列的值百分比分位数。
返回数据类型: 双精度浮点数 Double。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表。
使用说明:P值取值范围 0≤P≤100,为 0 的时候等同于 MIN,为 100 的时候等同于 MAX。
示例:
taos> SELECT PERCENTILE(current, 20) FROM d1001;
percentile(current, 20) |
============================
11.100000191 |
Query OK, 1 row(s) in set (0.000787s)
APERCENTILE
SELECT APERCENTILE(field_name, P[, algo_type])
FROM { tb_name | stb_name } [WHERE clause]
功能说明:统计表/超级表中指定列的值百分比分位数,与 PERCENTILE 函数相似,但是返回近似结果。
返回数据类型: 双精度浮点数 Double。
应用字段:不能应用在 timestamp、binary、nchar、bool 类型字段。
适用于:表、超级表。
使用说明
- P值有效取值范围 0≤P≤100,为 0 的时候等同于 MIN,为 100 的时候等同于 MAX;
- algo_type的有效输入:default 和 t-digest
- 用于指定计算近似分位数的算法。可不提供第三个参数的输入,此时将使用 default 的算法进行计算,即 apercentile(column_name, 50, "default") 与 apercentile(column_name, 50) 等价。
- 当使用“t-digest”参数的时候,将使用 t-digest 方式采样计算近似分位数。但该参数指定计算算法的功能从 2.2.0.x 版本开始支持,2.2.0.0 之前的版本不支持指定使用算法的功能。
嵌套子查询支持:适用于内层查询和外层查询。
taos> SELECT APERCENTILE(current, 20) FROM d1001;
apercentile(current, 20) |
============================
10.300000191 |
Query OK, 1 row(s) in set (0.000645s)
taos> select apercentile (count, 80, 'default') from stb1;
apercentile (c0, 80, 'default') |
==================================
601920857.210056424 |
Query OK, 1 row(s) in set (0.012363s)
taos> select apercentile (count, 80, 't-digest') from stb1;
apercentile (c0, 80, 't-digest') |
===================================
605869120.966666579 |
Query OK, 1 row(s) in set (0.011639s)
LAST_ROW
SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };
功能说明:返回表/超级表的最后一条记录。
返回数据类型:同应用的字段。
应用字段:所有 字段。
适用于:表、超级表。
使用说明:
- 在用于超级表时,时间戳完全一样且同为最大的数据行可能有多个,那么会从中随机返回一条,而并不保证多次运行所挑选的数据行必然一致。
- 不能与 INTERVAL 一起使用。
示例:
taos> SELECT LAST_ROW(current) FROM meters;
last_row(current) |
=======================
12.30000 |
Query OK, 1 row(s) in set (0.001238s)
taos> SELECT LAST_ROW(current) FROM d1002;
last_row(current) |
=======================
10.30000 |
Query OK, 1 row(s) in set (0.001042s)
INTERP [2.3.1 及之后的版本]
SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [ RANGE(timestamp1,timestamp2) ] [EVERY(interval)] [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
功能说明:返回表/超级表的指定时间截面指定列的记录值(插值)。
返回数据类型:同字段类型。
应用字段:数值型字段。
适用于:表、超级表、嵌套查询。
使用说明
- INTERP 用于在指定时间断面获取指定列的记录值,如果该时间断面不存在符合条件的行数据,那么会根据 FILL 参数的设定进行插值。
- INTERP 的输入数据为指定列的数据,可以通过条件语句(where 子句)来对原始列数据进行过滤,如果没有指定过滤条件则输入为全部数据。
- INTERP 的输出时间范围根据 RANGE(timestamp1,timestamp2)字段来指定,需满足 timestamp1<=timestamp2。其中 timestamp1(必选值)为输出时间范围的起始值,即如果 timestamp1 时刻符合插值条件则 timestamp1 为输出的第一条记录,timestamp2(必选值)为输出时间范围的结束值,即输出的最后一条记录的 timestamp 不能大于 timestamp2。如果没有指定 RANGE,那么满足过滤条件的输入数据中第一条记录的 timestamp 即为 timestamp1,最后一条记录的 timestamp 即为 timestamp2,同样也满足 timestamp1 <= timestamp2。
- INTERP 根据 EVERY 字段来确定输出时间范围内的结果条数,即从 timestamp1 开始每隔固定长度的时间(EVERY 值)进行插值。如果没有指定 EVERY,则默认窗口大小为无穷大,即从 timestamp1 开始只有一个窗口。
- INTERP 根据 FILL 字段来决定在每个符合输出条件的时刻如何进行插值,如果没有 FILL 字段则默认不插值,即输出为原始记录值或不输出(原始记录不存在)。
- INTERP 只能在一个时间序列内进行插值,因此当作用于超级表时必须跟 group by tbname 一起使用,当作用嵌套查 询外层时内层子查询不能含 GROUP BY 信息。
- INTERP 的插值结果不受 ORDER BY timestamp 的影响,ORDER BY timestamp 只影响输出结果的排序。
SQL示例(基于文档中广泛使用的电表 schema ):
- 单点线性插值
taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:40:00','2017-7-14 18:40:00') FILL(LINEAR);
- 在2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行取值(不插值)
taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s);
- 在2017-07-14 18:00:00到2017-07-14 19:00:00间每隔5秒钟进行线性插值
taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);
- 在所有时间范围内每隔 5 秒钟进行向后插值
taos> SELECT INTERP(current) FROM t1 EVERY(5s) FILL(NEXT);
- 根据 2017-07-14 17:00:00 到 2017-07-14 20:00:00 间的数据进行从 2017-07-14 18:00:00 到 2017-07-14 19:00:00 间每隔 5 秒钟进行线性插值
taos> SELECT INTERP(current) FROM t1 where ts >= '2017-07-14 17:00:00' and ts <= '2017-07-14 20:00:00' RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);
INTERP [2.3.1 之前的版本]
SELECT INTERP(field_name) FROM { tb_name | stb_name } WHERE ts='timestamp' [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];
功能说明:返回表/超级表的指定时间截面、指定字段的记录。
返回数据类型:同字段类型。
应用字段:数值型字段。
适用于:表、超级表。