1.tdengine 时序数据特有的函数
时序数据特有函数是 TDENGINE 针对时序数据查询场景专门设计的一组函数。实现了高效
且易于使用的时序数据处理能力。
cum: 累加和(cumulative sum),忽略NULL 值。
derivative: 统计表中某列数值的单位变化率。其中单位时间区间的长度可以通过 time_interval 参数指定,
最小可以是1s,ignore_negative 参数的值可以是0或1,为1时表示忽略负值。
diff: 统计表中某列的值与前一行对应值的差。ingore_negative 取值为0或1,可以不填,默认值为0,。不忽略负值,
ignore_negative 为1 时 表示忽略负值。
irate: 计算瞬时增长率。使用时间区间中最后两个样本数据来计算瞬时增长率。
如果这两个值呈递减关系,那么只取最后一个数用于计算,而不是使用二者差值。
mavg: 计算连续k个值的移动平均数。如果输入行数小于k,则无结果数据。参数k的合法输入范围是 [1,1000];
statecount: 返回某个条件的连续记录的条数,结果作为新的一列追加在每行后面,根据参数计算;如果条件
为 true则加1,如果条件为false ,则重置为-1;如果数据为null,则跳过该条数据。
twa: 时间加权平均函数,统计表中某列在一段时间内的时间加权平均值。
2.嵌套查询
tdengine 支持非关联子查询。
select max(voltage),* from (
select tbname,last_row(ts),voltage,current,phase,groupid,location from meters
partition by tbname
)group by groupid;
| groupid | location |
=================================================================================================================================================================================
6 | d1 | 2023-11-15 06:13:10.000 | 6 | 1.0294620 | 0.3531540 | 6 | California.PaloAlto |
8 | d17 | 2023-11-15 06:13:10.000 | 8 | 1.0294620 | 0.3431540 | 4 | California.Cupertino |
0 | d20 | 2023-03-11 12:54:20.000 | 0 | -1.0278960 | -0.3326320 | 2 | California.Cupertino |
16 | d2 | 2023-11-15 06:13:10.000 | 16 | 1.1294620 | 0.3431540 | 5 | California.SanJose |
16 | d18 | 2023-11-15 06:13:10.000 | 16 | 1.1294620 | 0.3631540 | 9 | California.SanJose |
16 | d8 | 2023-11-15 06:13:10.000 | 16 | 1.1294620 | 0.3531540 | 1 | California.LosAngles |
14 | d6 | 2023-11-15 06:13:10.000 | 14 | 1.0294620 | 0.3431540 | 10 | California.SanDiego |
16 | d28 | 2023-05-04 18:00:20.000 | 16 | -1.0212560 | -0.3304190 | 8 | California.Cupertino |
16 | d4 | 2023-11-15 06:13:10.000 | 16 | 1.1294620 | 0.3531540 | 3 | California.MountainView |
Query OK, 9 row(s) in set (0.020100s)
#按照tbname分组,查询每张子表最新一条数据。
#然后按照groupid进行聚合,查询每组中的最大电流。
Tdengine中嵌套查询的规则:
内存查询的返回结果将作为虚拟表提供外层查询使用,建议为虚拟机表起别名,以便在外层查询中引用。
外层查询支持直接通过列名或列名的形式引用内层查询的列或伪列。
不论内存查询还是外层查询,都支持普通的表间,超级表间join操作。内层查询的计算结果也可以再参与
数据子表的Join操作。
内存查询支持的功能特性与非嵌套的查询语句能力是一致的。内存查询的 Order by 子句一般没有意义,避免编写。
与非嵌套的查询语句相比,外层查询所能支持的功能特性存在如下限制。
如果内存查询的结果数据未提供时间戳,那么计算过程隐式依赖时间戳的函数在外层无法正常工作,如:
interp,derivative,irate,last_row,first,last,twa,stateduration,tail,unique ;
如果内存查询的结果数据不是时间有序的,那么计算过程依赖数据按时间有序的函数在外层会无法正常工作。
如: leastsquares,elapsed,interp,derivative,irate,twa,diff ,statecount,stateduration,csum,mavg,tail,unique;
计算过程需要扫描两边的函数,在外层查询中无法正常工作。如 percentile;
3.union 子句
(select tbname,* from d1 limit 1) union all
(select tbname,* from d11 limit 2) union all
(select tbname,* from d21 limit 3) ;
tbname | ts | current | voltage | phase |
=======================================================================================================================
d1 | 2020-09-13 20:26:40.000 | 1.1260610 | 18 | 0.3420200 |
Query OK, 1 row(s) in set (0.013222s)
在同一个SQL中最多支持100个UNION 子句。