聚合查询是时序数据分析的核心能力,通过聚合函数和分组操作,可以从海量时序数据中提取有价值的统计信息。本文将详细介绍TDengine时序数据库的聚合查询功能。
一、聚合查询基础
1.1 什么是聚合查询
聚合查询是指对一组数据进行汇总计算,返回单一结果的查询方式。在时序数据库场景中,聚合查询常用于:
- 计算平均值、最大值、最小值
- 统计数据量
- 按维度分组汇总
- 计算数据分布特征
1.2 GROUP BY子句规则
TDengine支持通过GROUP BY子句对数据进行聚合查询。SQL语句包含GROUP BY子句时,SELECT列表只能包含如下表达式:
- 常量
- 聚合函数
- 与GROUP BY后表达式相同的表达式
- 包含前面表达式的表达式
1.3 基本聚合查询示例
SELECT groupid, avg(voltage)
FROM meters
WHERE ts >= "2022-01-01T00:00:00+08:00"
AND ts < "2023-01-01T00:00:00+08:00"
GROUP BY groupid;
上面的SQL查询超级表meters中指定时间范围的数据,按照groupid进行分组,求每组的平均电压。
查询结果:
groupid | avg(voltage) |
======================================
8 | 243.961981544901079 |
5 | 243.961981544901079 |
1 | 243.961981544901079 |
7 | 243.961981544901079 |
9 | 243.961981544901079 |
6 | 243.961981544901079 |
4 | 243.961981544901079 |
10 | 243.961981544901079 |
2 | 243.961981544901079 |
3 | 243.961981544901079 |
Query OK, 10 row(s) in set (0.042446s)
注意:GROUP BY子句在聚合数据时,并不保证结果集按照特定顺序排列。为了获得有序的结果集,可以使用ORDER BY子句对结果进行排序。
二、内置聚合函数详解
TDengine提供了多种内置的聚合函数,满足不同的分析需求。
2.1 基础统计函数
| 函数 | 功能说明 | 示例 |
|---|---|---|
| AVG | 统计指定字段的平均值 | AVG(voltage) |
| COUNT | 统计指定字段的记录行数 | COUNT(*) |
| SUM | 统计表中某列的和 | SUM(current) |
| MAX | 统计表中某列的最大值 | MAX(voltage) |
| MIN | 统计表中某列的最小值 | MIN(voltage) |
2.2 高级统计函数
| 函数 | 功能说明 |
|---|---|
| STDDEV | 统计表中某列的均方差 |
| SPREAD | 统计表中某列的最大值和最小值之差 |
| PERCENTILE | 统计表中某列的值百分比分位数 |
| APERCENTILE | 统计表/超级表中指定列的值的近似百分比分位数 |
2.3 时序特色函数
| 函数 | 功能说明 |
|---|---|
| ELAPSED | 表达统计周期内连续的时间长度,和TWA函数配合使用可以计算统计曲线下的面积 |
| LEASTSQUARES | 统计表中某列的值的拟合直线方程 |
| HYPERLOGLOG | 采用hyperloglog算法,返回某列的基数 |
| HISTOGRAM | 统计数据按照用户指定区间的分布 |
三、常用聚合函数应用
3.1 AVG – 平均值计算
-- 计算所有设备的平均电压
SELECT AVG(voltage) FROM meters;
-- 按分组计算平均电压
SELECT groupid, AVG(voltage) FROM meters GROUP BY groupid;
-- 按地区计算平均电流
SELECT location, AVG(current) FROM meters GROUP BY location;
3.2 COUNT – 计数统计
-- 统计总记录数
SELECT COUNT(*) FROM meters;
-- 统计非空值数量
SELECT COUNT(voltage) FROM meters;
-- 按设备统计记录数
SELECT tbname, COUNT(*) FROM meters GROUP BY tbname;
3.3 SUM – 求和计算
-- 计算电流总和
SELECT SUM(current) FROM meters;
-- 按分组计算电流总和
SELECT groupid, SUM(current) FROM meters GROUP BY groupid;
3.4 SPREAD – 极差计算
SPREAD函数计算最大值与最小值的差值,常用于分析数据波动范围:
-- 计算电压波动范围
SELECT SPREAD(voltage) FROM meters;
-- 按设备计算电压波动范围
SELECT tbname, SPREAD(voltage) FROM meters GROUP BY tbname;
3.5 STDDEV – 标准差计算
标准差反映数据的离散程度:
-- 计算电压标准差
SELECT STDDEV(voltage) FROM meters;
-- 按分组计算电压标准差
SELECT groupid, STDDEV(voltage) FROM meters GROUP BY groupid;
四、百分位数函数
4.1 PERCENTILE
精确计算百分位数:
-- 计算电压的中位数(50%分位数)
SELECT PERCENTILE(voltage, 50) FROM meters;
-- 计算电压的95%分位数
SELECT PERCENTILE(voltage, 95) FROM meters;
4.2 APERCENTILE
近似计算百分位数,适用于大数据量场景:
-- 近似计算电压的中位数
SELECT APERCENTILE(voltage, 50) FROM meters;
APERCENTILE与PERCENTILE相似,但返回近似结果,在大数据量情况下性能更好。
五、LEASTSQUARES – 线性拟合
LEASTSQUARES函数用于计算数据的线性拟合方程:
-- 计算电流随时间变化的线性拟合
SELECT LEASTSQUARES(current, 1, 1) FROM d1001;
参数说明:
- 第一个参数:要拟合的列
- 第二个参数:自变量初始值
- 第三个参数:自变量的步长值
六、HYPERLOGLOG – 基数估计
HYPERLOGLOG采用hyperloglog算法返回某列的基数(不同值的个数):
-- 估计不同电压值的数量
SELECT HYPERLOGLOG(voltage) FROM meters;
该算法在数据量很大的情况下,可以明显降低内存的占用。求出来的基数是个估算值,标准误差为0.81%。
七、HISTOGRAM – 数据分布统计
HISTOGRAM函数统计数据按照用户指定区间的分布:
-- 统计电压在不同区间的分布
SELECT HISTOGRAM(voltage, 200, 250, 10) FROM meters;
八、聚合查询最佳实践
8.1 结合时间范围
聚合查询应结合时间范围条件,提高查询效率:
SELECT groupid, AVG(voltage), MAX(voltage), MIN(voltage)
FROM meters
WHERE ts >= '2022-01-01 00:00:00' AND ts < '2022-02-01 00:00:00'
GROUP BY groupid;
8.2 多聚合函数组合
可以在一个查询中使用多个聚合函数:
SELECT groupid,
COUNT(*) as count,
AVG(voltage) as avg_voltage,
MAX(voltage) as max_voltage,
MIN(voltage) as min_voltage,
STDDEV(voltage) as std_voltage
FROM meters
WHERE ts >= '2022-01-01 00:00:00'
GROUP BY groupid;
8.3 使用HAVING过滤分组
HAVING子句用于过滤分组后的结果:
SELECT groupid, AVG(voltage) as avg_v
FROM meters
GROUP BY groupid
HAVING avg_v > 240;
8.4 结果排序
使用ORDER BY对聚合结果排序:
SELECT groupid, AVG(voltage) as avg_v
FROM meters
GROUP BY groupid
ORDER BY avg_v DESC;
九、直接在超级表上聚合
用户可以直接在超级表上执行聚合查询,无须预先创建子表:
SELECT location, AVG(voltage), COUNT(*)
FROM meters
WHERE ts >= '2022-01-01 00:00:00'
GROUP BY location;
TDengine会自动处理所有子表的数据聚合,大大简化了查询逻辑。
总结
聚合查询是时序数据分析的核心能力,TDengine时序数据库提供了丰富的聚合函数和灵活的分组机制。从基础的COUNT、AVG、SUM到高级的PERCENTILE、LEASTSQUARES,这些函数覆盖了时序数据分析的主要场景。通过合理使用聚合查询,开发者可以从海量时序数据中快速提取有价值的信息,为工业数据管理平台(IDMP)和实时数据库应用提供强大的数据支撑。TDengine凭借其高效的聚合查询能力,成为物联网和工业场景数据分析的理想选择。

























