TDengine 时序函数 IRATE 用户手册

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 函数是智能电表监控系统中分析瞬时变化趋势的重要工具:

主要特点

  1. 瞬时性:基于最后两个数据点计算,反映最新趋势
  2. 智能处理:对递减数据采用特殊算法,避免负增长误判
  3. NULL 容忍:自动忽略 NULL 值,寻找有效数据点计算
  4. 高效聚合:每组返回一个结果,适合实时监控

应用价值

  1. 实时监控:快速识别设备负荷变化趋势
  2. 异常检测:及时发现功率、电流等指标的异常增长
  3. 效率分析:评估设备运行效率的瞬时变化
  4. 预警机制:为告警系统提供瞬时增长率指标

最佳实践

  • 使用嵌套查询处理结果过滤,避免在 WHERE/HAVING 中直接使用聚合函数
  • 合理处理 NULL 返回值,提供友好的状态描述
  • 选择合适的时间窗口,确保有足够数据点
  • 结合 CASE WHEN 语句提供状态判断
  • 在应用层处理复杂的阈值逻辑

通过正确使用 IRATE 函数,可以为智能电表系统提供精准的瞬时增长率分析能力,支撑实时监控和智能决策。

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
不剪发的Tony老师2 小时前
SQLE:一个全方位的SQL质量管理平台
数据库·sql
lixora2 小时前
postgres linux 环境psql 中文乱码处理
数据库
TDengine (老段)2 小时前
TDengine 时序函数 CSUM 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
摇滚侠3 小时前
在 Oracle SQL 中实现 `IF-ELSE` 逻辑 SQL 错误 [12704] [72000]: ORA-12704: 字符集不匹配
数据库·sql·oracle
京东零售技术4 小时前
京东零售胡浩:智能供应链从运筹到大模型到超级智能体的演进
大数据·人工智能
lypzcgf7 小时前
Coze源码分析-资源库-删除数据库-后端源码-流程/核心技术/总结
数据库·go·coze·coze源码分析·智能体平台·ai应用平台·agent平台
土丁爱吃大米饭8 小时前
重磅!Repo Wiki!
大数据·词法分析·语义分析·语法分析·qoder·repo wiki
l1t9 小时前
拉取postgresql 18.0 docker镜像并运行容器
数据库·docker·postgresql
问道飞鱼9 小时前
【大数据技术】ClickHouse配置详细解读
大数据·clickhouse·配置信息