TDengine 时序函数 MAVG 用户手册
MAVG 函数用户手册(智能电表场景)- 最终修正版
1. 函数概述
MAVG
是 TDengine 的时序聚合函数,用于计算连续 k 个值的移动平均数(Moving Average)。该函数在智能电表监控系统中特别适用于平滑电压、电流、功率等指标的波动,帮助识别数据趋势和异常。
核心特性:
- 计算滑动窗口内数据的平均值,平滑短期波动
- 如果输入行数小于 k,则无结果输出
- 参数 k 的合法输入范围是 1≤ k ≤ 1000
- 返回结果行数 = MAX(0, 输入行数 - k + 1)
2. 语法
SELECT MAVG(column_name, k) FROM table_name [WHERE condition];
参数说明
- column_name:需要计算移动平均的数值列
- k:滑动窗口大小,表示连续多少个数据点的平均值,取值范围 [1, 1000]
返回值说明
- 返回类型:DOUBLE
- 返回行数:输入行数 - k + 1(当输入行数 ≥ k 时)
- NULL 值处理:NULL 值会被跳过,不参与计算
3. 使用限制
3.1 函数分类说明
MAVG 属于特殊聚合函数,有严格的使用限制:
-- ❌ 错误:与普通列混用
SELECT ts, voltage, MAVG(voltage, 5) FROM d001;-- ❌ 错误:与其他聚合函数混用
SELECT MAVG(voltage, 5), AVG(voltage) FROM d001;
SELECT MAVG(voltage, 5), COUNT(*) FROM d001;-- ❌ 错误:与投影函数混用
SELECT ts, MAVG(voltage, 5), DERIVATIVE(current, 1, 0) FROM d001;-- ✅ 正确:单独使用
SELECT MAVG(voltage, 5) FROM d001;-- ✅ 正确:超级表直接查询
SELECT MAVG(voltage, 5) FROM meters;-- ✅ 正确:超级表分区查询
SELECT tbname, MAVG(voltage, 5) FROM meters PARTITION BY tbname;
SELECT st1, MAVG(voltage, 5) FROM meters PARTITION BY st1;
3.2 超级表使用方式
超级表查询支持两种方式:
-- 方式1:直接查询(所有子表数据合并计算)
SELECT MAVG(voltage, 5) FROM meters;-- 方式2:分区查询(按子表或标签分别计算)
SELECT tbname, MAVG(voltage, 5) FROM meters PARTITION BY tbname;
SELECT device_id, MAVG(voltage, 5) FROM meters PARTITION BY device_id;
4. 计算过程与返回值说明
4.1 计算过程
假设有如下智能电表电压数据:
时间戳 | 电压值 (V) |
---|---|
10:00:00 | 220.0 |
10:01:00 | 221.0 |
10:02:00 | 219.0 |
10:03:00 | 222.0 |
10:04:00 | 218.0 |
10:05:00 | 223.0 |
计算 MAVG(voltage, 3)
计算过程:
- 第1-2行:数据不足3个,无输出
- 第3行:(220.0 + 221.0 + 219.0) / 3 = 220.0
- 第4行:(221.0 + 219.0 + 222.0) / 3 = 220.67
- 第5行:(219.0 + 222.0 + 218.0) / 3 = 219.67
- 第6行:(222.0 + 218.0 + 223.0) / 3 = 221.0
4.2 返回值样式
SELECT MAVG(voltage, 3) FROM d001;
结果示例:
MAVG(voltage, 3) |
---|
220.000000 |
220.666667 |
219.666667 |
221.000000 |
5. 智能电表应用场景
基于智能电表数据库结构:
-- 超级表
CREATE STABLE meters (ts TIMESTAMP,voltage FLOAT,current FLOAT,power FLOAT
) TAGS (device_id VARCHAR(50),location VARCHAR(50)
);-- 子表
CREATE TABLE d001 USING meters TAGS ('meter001', 'California.SanFrancisco');
5.1 电压稳定性分析
-- 单个设备电压移动平均
SELECT MAVG(voltage, 5) FROM d001
WHERE ts >= NOW() - 1h;-- 超级表所有设备电压整体移动平均
SELECT MAVG(voltage, 10) FROM meters
WHERE ts >= NOW() - 30m;-- 按设备分别计算电压移动平均
SELECT tbname, MAVG(voltage, 10) FROM meters
WHERE ts >= NOW() - 30m
PARTITION BY tbname;
5.2 电流趋势监控
-- 电流移动平均分析
SELECT MAVG(current, 15) FROM d001
WHERE ts >= NOW() - 2h;-- 超级表电流整体趋势
SELECT MAVG(current, 5) FROM meters
WHERE ts >= NOW() - 1h;-- 按设备分组的电流趋势
SELECT tbname, MAVG(current, 5) FROM meters
WHERE ts >= NOW() - 1h
PARTITION BY tbname;
5.3 功率消耗分析
-- 功率移动平均
SELECT MAVG(power, 20) FROM d001
WHERE ts >= NOW() - 4h;-- 所有设备功率整体趋势
SELECT MAVG(power, 8) FROM meters
WHERE ts >= NOW() - 2h;-- 按设备分组的功率趋势
SELECT tbname, MAVG(power, 8) FROM meters
WHERE ts >= NOW() - 2h
PARTITION BY tbname;
5.4 区域用电分析
-- 按区域标签分区分析
SELECT location, MAVG(power, 5) FROM meters
WHERE ts >= NOW() - 1h
PARTITION BY location;-- 按设备类型分区分析
SELECT device_id, MAVG(voltage, 10) FROM meters
WHERE ts >= NOW() - 1h
PARTITION BY device_id;
5.5 常量和表达式支持
-- 使用常量值
SELECT MAVG(1, 5) FROM d001 WHERE ts >= NOW() - 30m;-- 使用标签表达式
SELECT MAVG(st1, 3) FROM meters PARTITION BY tbname;-- 使用列与标签的组合表达式
SELECT MAVG(st1+c1, 3) FROM meters PARTITION BY tbname;-- 使用数学函数
SELECT MAVG(ABS(voltage), 5) FROM d001;
5.6 分时段分析
-- 多时间段功率趋势对比
SELECT '最近1小时' AS period,MAVG(power, 10) AS power_trend
FROM meters
WHERE ts >= NOW() - 1hUNION ALLSELECT '1-2小时前' AS period,MAVG(power, 10) AS power_trend
FROM meters
WHERE ts BETWEEN NOW() - 2h AND NOW() - 1h;
5.7 条件过滤分析
-- 高功率设备的移动平均
SELECT MAVG(power, 5) FROM meters
WHERE power > 1000AND ts >= NOW() - 30m;-- 特定区域设备分析
SELECT tbname, MAVG(voltage, 8) FROM meters
WHERE location = 'California.SanFrancisco'AND ts >= NOW() - 1h
PARTITION BY tbname;
6. 使用注意事项
6.1 严格的混用限制
-- ❌ 错误:不能与任何其他函数混用
SELECT MAVG(voltage, 5), AVG(voltage) FROM d001; -- 聚合函数
SELECT MAVG(voltage, 5), COUNT(*) FROM d001; -- 聚合函数
SELECT MAVG(voltage, 5), MAX(voltage) FROM d001; -- 聚合函数
SELECT ts, MAVG(voltage, 5) FROM d001; -- 普通列
SELECT DERIVATIVE(voltage, 1, 0), MAVG(voltage, 5) FROM d001; -- 投影函数-- ✅ 正确:只能单独使用或与分区字段使用
SELECT MAVG(voltage, 5) FROM d001;
SELECT MAVG(voltage, 5) FROM meters;
SELECT tbname, MAVG(voltage, 5) FROM meters PARTITION BY tbname;
6.2 数据类型要求
-- ✅ 支持的数据类型
SELECT MAVG(voltage, 5) FROM d001; -- FLOAT
SELECT MAVG(current, 5) FROM d001; -- FLOAT
SELECT MAVG(power, 5) FROM d001; -- FLOAT-- ❌ 不支持的数据类型
SELECT MAVG(device_id, 3) FROM meters; -- 字符串类型
SELECT MAVG(ts, 5) FROM d001; -- 时间戳类型
6.3 参数范围限制
-- ✅ 正确的参数范围
SELECT MAVG(voltage, 1) FROM d001; -- 最小窗口
SELECT MAVG(voltage, 1000) FROM d001; -- 最大窗口-- ❌ 错误的参数范围
SELECT MAVG(voltage, 0) FROM d001; -- k < 1
SELECT MAVG(voltage, 1001) FROM d001; -- k > 1000
6.4 超级表查询选择
-- 整体趋势分析:直接查询
SELECT MAVG(voltage, 5) FROM meters;-- 设备对比分析:分区查询
SELECT tbname, MAVG(voltage, 5) FROM meters PARTITION BY tbname;-- 区域对比分析:按标签分区
SELECT location, MAVG(voltage, 5) FROM meters PARTITION BY location;
7. 实际应用案例
7.1 实时监控数据获取
-- 获取所有设备电压整体移动平均
SELECT MAVG(voltage, 5) AS global_voltage_smooth
FROM meters
WHERE ts >= NOW() - 15m;-- 获取各设备电压移动平均对比
SELECT tbname,MAVG(voltage, 5) AS voltage_smooth
FROM meters
WHERE ts >= NOW() - 15m
PARTITION BY tbname;
7.2 设备健康评估数据
-- 分别获取各项指标的移动平均
SELECT tbname, MAVG(voltage, 10) AS voltage_baseline
FROM meters WHERE ts >= NOW() - 30m PARTITION BY tbname;SELECT tbname, MAVG(current, 10) AS current_baseline
FROM meters WHERE ts >= NOW() - 30m PARTITION BY tbname;SELECT tbname, MAVG(power, 10) AS power_baseline
FROM meters WHERE ts >= NOW() - 30m PARTITION BY tbname;
7.3 区域电力质量对比
-- 按区域获取电压质量指标
SELECT location,MAVG(voltage, 10) AS region_voltage_trend
FROM meters
WHERE ts >= NOW() - 1h
PARTITION BY location;-- 全网电压质量整体评估
SELECT MAVG(voltage, 20) AS global_voltage_quality
FROM meters
WHERE ts >= NOW() - 2h;
7.4 负荷预测数据准备
-- 生成不同窗口的平滑数据
SELECT tbname, MAVG(power, 6) AS power_1hour_trend
FROM meters PARTITION BY tbname;SELECT tbname, MAVG(power, 36) AS power_6hour_trend
FROM meters PARTITION BY tbname;SELECT tbname, MAVG(power, 144) AS power_24hour_trend
FROM meters PARTITION BY tbname;
7.5 异常检测基准数据
-- 获取设备功率基准线
SELECT tbname,MAVG(power, 50) AS power_baseline
FROM meters
WHERE ts >= NOW() - 4h
PARTITION BY tbname;-- 在应用层与实时数据对比检测异常
-- if (real_time_power > power_baseline * 1.5) { alert(); }
8. 窗口大小选择指南
8.1 短期平滑(k = 3-10)
-- 适用场景:实时监控、快速响应
SELECT MAVG(voltage, 5) FROM d001; -- 5分钟平滑
8.2 中期趋势(k = 10-60)
-- 适用场景:趋势分析、模式识别
SELECT MAVG(power, 30) FROM d001; -- 30分钟趋势
8.3 长期趋势(k = 60-1000)
-- 适用场景:战略分析、容量规划
SELECT MAVG(power, 288) FROM d001; -- 24小时趋势(5分钟间隔)
9. 性能优化建议
9.1 时间范围控制
-- 推荐:限制时间范围
SELECT MAVG(voltage, 10) FROM meters WHERE ts >= NOW() - 2h;-- 避免:全表扫描
SELECT MAVG(voltage, 10) FROM meters; -- 可能影响性能
9.2 合理选择查询方式
-- 整体分析:直接查询,性能更优
SELECT MAVG(power, 5) FROM meters WHERE ts >= NOW() - 1h;-- 对比分析:分区查询,结果更详细
SELECT tbname, MAVG(power, 5) FROM meters
WHERE ts >= NOW() - 1h
PARTITION BY tbname;
9.3 标签过滤优化
-- 推荐:结合标签过滤减少数据量
SELECT tbname, MAVG(power, 5) FROM meters
WHERE ts >= NOW() - 1h AND location = 'California.SanFrancisco'
PARTITION BY tbname;
10. 总结
MAVG 函数是智能电表监控系统中进行数据平滑和趋势分析的重要聚合函数:
主要特点
- 数据平滑:有效消除短期波动,显示真实趋势
- 灵活查询:支持超级表直接查询和分区查询两种方式
- 严格限制:不能与任何其他函数或普通列混用
- 参数灵活:支持1-1000的窗口大小,适应不同分析需求
应用价值
- 趋势识别:清晰显示电力参数的变化方向和幅度
- 整体监控:支持全网设备的整体趋势分析
- 对比分析:支持设备间、区域间的移动平均对比
- 预测支撑:为负荷预测和容量规划提供平滑数据
最佳实践
- 查询方式选择:整体分析用直接查询,对比分析用分区查询
- 独立使用:确保 SELECT 语句中只有 MAVG 函数和分区字段
- 分步分析:需要多指标分析时,分别查询后在应用层合并
- 合理窗口:根据监控目标选择合适的窗口大小
- 时间限制:结合时间范围提高查询性能
通过正确使用 MAVG 函数,可以为智能电表系统提供全面的数据平滑能力,支撑整体监控、趋势分析和预测等核心业务场景。
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。