
IRATE 函数用户手册(智能电表场景)
1. 函数概述
IRATE
是 TDengine 的时间序列聚合函数,用于计算瞬时增长率(Instantaneous Rate)。该函数使用时间区间中最后两个样本数据来计算瞬时增长速率,特别适用于监测系统中快速变化指标的瞬时增长趋势分析。
核心特性:
- 使用最后两个有效数据点计算增长率
- 当数据呈递减关系时,只使用最后一个值计算(增长率为最后一个值/时间差)
- 对于复合主键表,时间戳相同时只有主键最小的数据参与运算
- 返回每秒的增长速率
2. 语法
sql
SELECT IRATE(column_name) FROM table_name [WHERE condition];
参数说明
column_name
:需要计算瞬时增长率的数值列- 只接受一个数值类型参数
- 不支持多参数或嵌套使用
返回值说明
- 返回类型:DOUBLE
- 返回值意义:每秒的瞬时增长率
- 返回行数:每个分组返回一行结果
3. NULL 值处理
3.1 输入 NULL 值处理
sql
-- 示例数据包含 NULL 值
-- 时间戳: 10:00, 10:01, 10:02, 10:03, 10:04
-- 功率值: 1000, NULL, 1200, 1500, NULL
SELECT IRATE(power) FROM meters;
处理规则:
- NULL 值会被自动忽略,不参与计算
- IRATE 会自动寻找最后两个非 NULL 值进行计算
- 在上述示例中,使用 1200 和 1500 进行计算
3.2 返回 NULL 的情况
sql
-- 情况1:所有值都是 NULL
SELECT IRATE(power) FROM meters WHERE power IS NULL;
-- 返回:NULL
-- 情况2:只有一个非 NULL 值
SELECT IRATE(power) FROM meters WHERE ts = '2024-09-22 10:00:00';
-- 返回:NULL(需要至少两个数据点)
-- 情况3:没有数据
SELECT IRATE(power) FROM meters WHERE 1=0;
-- 返回:NULL
3.3 NULL 值处理示例
sql
-- 创建测试数据
INSERT INTO d001 VALUES
('2024-09-22 10:00:00', 1000.0),
('2024-09-22 10:01:00', NULL),
('2024-09-22 10:02:00', 1200.0),
('2024-09-22 10:03:00', 1500.0),
('2024-09-22 10:04:00', NULL);
-- IRATE 计算会忽略 NULL,使用 1200 和 1500
SELECT IRATE(power) AS growth_rate FROM d001;
-- 结果:使用最后两个非NULL值 1200 和 1500 计算
-- 增长率 = (1500 - 1200) / 时间差(秒)
4. 计算原理与实际意义
4.1 计算公式
正常情况(最后两个值递增)
IRATE = (最后一个值 - 倒数第二个值) × 1000 / (最后时间戳 - 倒数第二时间戳)
特殊情况(最后两个值递减)
IRATE = 最后一个值 × 1000 / (最后时间戳 - 倒数第二时间戳)
4.2 计算示例
假设智能电表功率数据:
时间戳 | 功率值 |
---|---|
10:01:00 | 1000W |
10:01:05 | 1200W |
10:01:10 | 1150W |
计算过程:
- 最后两个值:1200W, 1150W (递减关系)
- 时间差:5秒
- 由于递减,使用特殊公式:IRATE = 1150 × 1000 / 5000 = 0.23
5. 智能电表应用场景
基于智能电表数据库结构:
sql
-- 超级表
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 功率瞬时增长率监控
sql
-- 单个设备功率瞬时增长率
SELECT IRATE(power) AS power_growth_rate
FROM d001
WHERE ts >= NOW() - 1h;
-- 多设备功率增长率对比
SELECT
device_id,
IRATE(power) AS power_growth_rate
FROM meters
WHERE ts >= NOW() - 30m
GROUP BY device_id;
5.2 电流瞬时变化监控
sql
-- 检测电流瞬时增长率
SELECT
location,
IRATE(current) AS current_growth_rate
FROM meters
WHERE ts >= NOW() - 15m
GROUP BY location;
5.3 异常检测应用(修正版)
❌ 错误写法(TDengine 不支持):
sql
-- 错误:在 HAVING 中使用聚合函数表达式
SELECT device_id, IRATE(current) AS current_rate
FROM meters
WHERE ts >= NOW() - 5m
GROUP BY device_id
HAVING ABS(IRATE(current)) > 0.2;
-- 错误:在 WHERE 中使用聚合函数
SELECT * FROM meters WHERE IRATE(power) > 0.5;
✅ 正确写法:
sql
-- 方法1:使用嵌套查询
SELECT * FROM (
SELECT
device_id,
IRATE(current) AS current_rate
FROM meters
WHERE ts >= NOW() - 5m
GROUP BY device_id
)
WHERE ABS(current_rate) > 0.2;
-- 方法2:分步查询,应用层过滤
SELECT
device_id,
IRATE(current) AS current_rate
FROM meters
WHERE ts >= NOW() - 5m
GROUP BY device_id
ORDER BY current_rate DESC;
-- 然后在应用层代码中过滤 ABS(current_rate) > 0.2 的记录
5.4 实时监控大屏应用
sql
-- 获取各设备的功率瞬时增长率,供前端判断状态
SELECT
device_id,
location,
IRATE(power) AS instant_growth
FROM meters
WHERE ts >= NOW() - 10m
GROUP BY device_id, location
ORDER BY instant_growth DESC;
-- 前端 JavaScript 处理逻辑
/*
data.forEach(row => {
if (row.instant_growth > 0.5) {
row.status = '快速增长';
row.alert_level = 'high';
} else if (row.instant_growth < -0.5) {
row.status = '快速下降';
row.alert_level = 'high';
} else {
row.status = '稳定';
row.alert_level = 'normal';
}
});
*/
5.5 分时段分析
sql
-- 获取不同时间段的瞬时增长率
SELECT
'最近5分钟' AS time_period,
device_id,
IRATE(power) AS growth_rate
FROM meters
WHERE ts >= NOW() - 5m
GROUP BY device_id
UNION ALL
SELECT
'5-10分钟前' AS time_period,
device_id,
IRATE(power) AS growth_rate
FROM meters
WHERE ts BETWEEN NOW() - 10m AND NOW() - 5m
GROUP BY device_id;
6. 使用注意事项与限制
6.1 聚合函数使用限制
sql
-- ❌ 错误:不能在 WHERE 子句中使用聚合函数
SELECT * FROM meters WHERE IRATE(power) > 0.1;
-- ❌ 错误:不能在 HAVING 中直接使用聚合函数表达式
SELECT device_id, IRATE(power) FROM meters
GROUP BY device_id
HAVING ABS(IRATE(power)) > 0.5;
-- ✅ 正确:使用嵌套查询
SELECT * FROM (
SELECT device_id, IRATE(power) AS rate FROM meters GROUP BY device_id
) WHERE ABS(rate) > 0.5;
6.2 数据要求
sql
-- ✅ 正确:确保有足够的数据点
SELECT IRATE(power) FROM d001 WHERE ts >= NOW() - 1h;
-- ⚠️ 注意:数据点不足可能返回NULL
SELECT IRATE(power) FROM d001 WHERE ts >= NOW() - 1s;
6.3 数据类型限制
sql
-- ✅ 支持的数据类型
SELECT IRATE(power) FROM meters; -- FLOAT
SELECT IRATE(voltage) FROM meters; -- FLOAT
SELECT IRATE(current) FROM meters; -- FLOAT
-- ❌ 不支持的数据类型
SELECT IRATE(device_id) FROM meters; -- 字符串类型
SELECT IRATE(ts) FROM meters; -- 时间戳类型
6.4 NULL 值的实际处理建议
sql
-- 处理可能的 NULL 结果
SELECT
device_id,
IRATE(power) AS growth_rate,
CASE
WHEN IRATE(power) IS NULL THEN '数据不足'
WHEN IRATE(power) > 0.5 THEN '快速增长'
WHEN IRATE(power) < -0.5 THEN '快速下降'
ELSE '稳定'
END AS status
FROM meters
WHERE ts >= NOW() - 30m
GROUP BY device_id;
7. 常见错误及解决方案
7.1 语法错误
sql
-- ❌ 错误用法
SELECT IRATE() FROM meters; -- 无参数
SELECT IRATE(power, current) FROM meters; -- 多参数
SELECT IRATE(IRATE(power)) FROM meters; -- 嵌套使用
-- ✅ 正确用法
SELECT IRATE(power) FROM meters; -- 单个数值参数
7.2 条件过滤错误处理
sql
-- ❌ 错误:直接在条件中使用聚合函数
SELECT device_id FROM meters
WHERE IRATE(power) > 0.1
GROUP BY device_id;
-- ✅ 正确:使用嵌套查询
SELECT device_id FROM (
SELECT device_id, IRATE(power) AS rate
FROM meters
GROUP BY device_id
)
WHERE rate > 0.1;
7.3 NULL 值处理示例
sql
-- 查询示例(包含 NULL 处理)
SELECT
device_id,
IRATE(power) AS power_growth_rate,
CASE
WHEN IRATE(power) IS NULL THEN 'NULL - 数据不足或全为空值'
ELSE CONCAT(CAST(IRATE(power) AS VARCHAR(20)), ' W/s')
END AS growth_description
FROM meters
WHERE ts >= NOW() - 30m
GROUP BY device_id
ORDER BY power_growth_rate DESC;
8. 总结
IRATE 函数是智能电表监控系统中分析瞬时变化趋势的重要工具:
主要特点
- 瞬时性:基于最后两个数据点计算,反映最新趋势
- 智能处理:对递减数据采用特殊算法,避免负增长误判
- NULL 容忍:自动忽略 NULL 值,寻找有效数据点计算
- 高效聚合:每组返回一个结果,适合实时监控
应用价值
- 实时监控:快速识别设备负荷变化趋势
- 异常检测:及时发现功率、电流等指标的异常增长
- 效率分析:评估设备运行效率的瞬时变化
- 预警机制:为告警系统提供瞬时增长率指标
最佳实践
- 使用嵌套查询处理结果过滤,避免在 WHERE/HAVING 中直接使用聚合函数
- 合理处理 NULL 返回值,提供友好的状态描述
- 选择合适的时间窗口,确保有足够数据点
- 结合 CASE WHEN 语句提供状态判断
- 在应用层处理复杂的阈值逻辑
通过正确使用 IRATE 函数,可以为智能电表系统提供精准的瞬时增长率分析能力,支撑实时监控和智能决策。
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。