时序数据库聚合查询详解:GROUP BY与聚合函数完全指南

Xiaxin Li

2026-04-17 /

聚合查询是时序数据分析的核心能力,通过聚合函数和分组操作,可以从海量时序数据中提取有价值的统计信息。本文将详细介绍TDengine时序数据库的聚合查询功能。

一、聚合查询基础

1.1 什么是聚合查询

聚合查询是指对一组数据进行汇总计算,返回单一结果的查询方式。在时序数据库场景中,聚合查询常用于:

  • 计算平均值、最大值、最小值
  • 统计数据量
  • 按维度分组汇总
  • 计算数据分布特征

1.2 GROUP BY子句规则

TDengine支持通过GROUP BY子句对数据进行聚合查询。SQL语句包含GROUP BY子句时,SELECT列表只能包含如下表达式:

  1. 常量
  2. 聚合函数
  3. 与GROUP BY后表达式相同的表达式
  4. 包含前面表达式的表达式

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凭借其高效的聚合查询能力,成为物联网和工业场景数据分析的理想选择。