时间维度聚合

TDengine支持按时间段进行聚合,可以将表中数据按照时间段进行切割后聚合生成结果,比如温度传感器每秒采集一次数据,但需查询每隔10分钟的温度平均值。这个聚合适合于降维(down sample)操作, 语法如下:

  1. SELECT function_list FROM tb_name
  2. [WHERE where_condition]
  3. INTERVAL (interval [, offset])
  4. [SLIDING sliding]
  5. [FILL ({NONE | VALUE | PREV | NULL | LINEAR})]
  6. SELECT function_list FROM stb_name
  7. [WHERE where_condition]
  8. INTERVAL (interval [, offset])
  9. [SLIDING sliding]
  10. [FILL ({ VALUE | PREV | NULL | LINEAR})]
  11. [GROUP BY tags]
  • 聚合时间段的长度由关键词INTERVAL指定,最短时间间隔10毫秒(10a),并且支持偏移(偏移必须小于间隔)。聚合查询中,能够同时执行的聚合和选择函数仅限于单个输出的函数:count、avg、sum 、stddev、leastsquares、percentile、min、max、first、last,不能使用具有多行输出结果的函数(例如:top、bottom、diff以及四则运算)。
  • WHERE语句可以指定查询的起止时间和其他过滤条件
  • SLIDING语句用于指定聚合时间段的前向增量
  • FILL语句指定某一时间区间数据缺失的情况下的填充模式。填充模式包括以下几种:
    • 不进行填充:NONE(默认填充模式)。
    • VALUE填充:固定值填充,此时需要指定填充的数值。例如:fill(value, 1.23)。
    • NULL填充:使用NULL填充数据。例如:fill(null)。
    • PREV填充:使用前一个非NULL值填充数据。例如:fill(prev)。

说明:

  1. 使用FILL语句的时候可能生成大量的填充输出,务必指定查询的时间区间。针对每次查询,系统可返回不超过1千万条具有插值的结果。
  2. 在时间维度聚合中,返回的结果中时间序列严格单调递增。
  3. 如果查询对象是超级表,则聚合函数会作用于该超级表下满足值过滤条件的所有表的数据。如果查询中没有使用group by语句,则返回的结果按照时间序列严格单调递增;如果查询中使用了group by语句分组,则返回结果中每个group内不按照时间序列严格单调递增。

时间聚合也常被用于连续查询场景,可以参考文档 连续查询(Continuous Query)

示例: 智能电表的建表语句如下:

  1. CREATE TABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT);

针对智能电表采集的数据,以10分钟为一个阶段,计算过去24小时的电流数据的平均值、最大值、电流的中位数、以及随着时间变化的电流走势拟合直线。如果没有计算值,用前一个非NULL值填充。 使用的查询语句如下:

  1. SELECT AVG(current), MAX(current), LEASTSQUARES(current, start_val, step_val), PERCENTILE(current, 50) FROM meters
  2. WHERE ts>=NOW-1d
  3. INTERVAL(10m)
  4. FILL(PREV);