TDengine 聚合函数 ELAPSED 用户手册
ELAPSED 函数用户手册
函数概述
ELAPSED 函数是 TDengine 中的聚合函数,用于计算查询时间范围内数据的时间跨度。该函数只能应用于主键时间戳列,返回第一条记录与最后一条记录之间的时间差。在智能电表场景中,常用于分析用电持续时间、数据采集间隔、设备运行周期等。
基本语法
SELECT ELAPSED(column_name [, time_unit]) FROM meters [WHERE clause] [GROUP BY clause]
参数说明
- column_name: 必须是主键时间戳列(通常为
ts
) - time_unit: 可选参数,指定返回结果的时间单位
1s
: 秒(默认)1m
: 分钟1h
: 小时1d
: 天1w
: 周1u
: 微秒(仅毫秒精度及以上支持)1b
: 纳秒(仅纳秒精度支持)
返回值
- 返回类型:DOUBLE
- 当查询结果只有一条记录或为空时,返回 0
- 当查询结果有多条记录时,返回时间跨度(按指定单位)
智能电表应用场景
基于智能电表数据库结构:
CREATE TABLE meters (ts TIMESTAMP,voltage FLOAT,current FLOAT,power FLOAT
) TAGS (groupid INT,location VARCHAR(50)
);
1. 基本用法
-- 计算电表数据的时间跨度(秒)
SELECT ELAPSED(ts) FROM meters;-- 指定时间单位为分钟
SELECT ELAPSED(ts, 1m) FROM meters;-- 指定时间单位为小时
SELECT ELAPSED(ts, 1h) FROM meters;-- 指定时间单位为天
SELECT ELAPSED(ts, 1d) FROM meters;
2. 电表数据采集监控
数据采集时间跨度分析
-- 计算过去24小时内数据采集的时间跨度
SELECT ELAPSED(ts, 1h) AS collection_hours FROM meters
WHERE ts >= NOW() - 24h;-- 分析某个区域电表数据的采集周期
SELECT ELAPSED(ts, 1m) AS collection_minutes FROM meters
WHERE location = 'California.SanFrancisco' AND ts >= NOW() - 2h;
按设备组分析采集情况
-- 各设备组数据采集时间跨度
SELECT groupid,location,ELAPSED(ts, 1h) AS data_span_hours,COUNT(*) AS record_count
FROM meters
WHERE ts >= NOW() - 24h
GROUP BY groupid, location;
3. 用电持续时间分析
高负荷用电时长统计
-- 计算功率超过阈值的持续时间
SELECT ELAPSED(ts, 1h) AS high_load_hours FROM meters
WHERE power > 5000 AND ts >= NOW() - 7d;-- 按区域统计高负荷用电时长
SELECT location,ELAPSED(ts, 1h) AS high_voltage_hours
FROM meters
WHERE voltage > 240 AND ts >= NOW() - 30d
GROUP BY location;
异常用电持续时间
-- 电压异常的持续时间分析
SELECT ELAPSED(ts, 1m) AS abnormal_voltage_minutes FROM meters
WHERE (voltage < 200 OR voltage > 250)AND ts >= NOW() - 24h;-- 电流异常持续时间统计
SELECT ELAPSED(ts, 1s) AS abnormal_current_seconds FROM meters
WHERE current > 50 AND location = 'California.LosAngles'AND ts >= NOW() - 6h;
4. 时间窗口分析
每小时数据跨度监控
-- 每小时内数据的时间跨度
SELECT ELAPSED(ts, 1s) AS hourly_span_seconds
FROM meters
WHERE ts >= NOW() - 24h
INTERVAL(1h);
每日数据完整性检查
-- 每日数据采集的时间跨度
SELECT ELAPSED(ts, 1h) AS daily_data_hours
FROM meters
WHERE ts >= NOW() - 30d
INTERVAL(1d);
5. 设备运行状态分析
设备在线时长统计
-- 计算各电表设备的在线时长(基于数据上报)
SELECT ELAPSED(ts, 1h) AS online_hours FROM meters
WHERE ts >= NOW() - 7d
PARTITION BY groupid, location;
连续运行时间分析
-- 电表连续正常运行时间(电压在正常范围内)
SELECT ELAPSED(ts, 1d) AS normal_operation_days FROM meters
WHERE voltage BETWEEN 210 AND 240 AND current > 0 AND ts >= NOW() - 90d;
6. 电网稳定性监控
电压稳定期分析
-- 电压在稳定范围内的持续时间
SELECT location,ELAPSED(ts, 1h) AS stable_voltage_hours
FROM meters
WHERE voltage BETWEEN 218 AND 222 AND ts >= NOW() - 7d
GROUP BY location;
负载稳定时长统计
-- 功率在正常范围内的持续时间
SELECT ELAPSED(ts, 1m) AS stable_power_minutes FROM meters
WHERE power BETWEEN 1000 AND 8000 AND ts >= NOW() - 24h;
7. 用电模式分析
白天用电时长
-- 白天时段(6:00-18:00)的用电时长
SELECT ELAPSED(ts, 1h) AS daytime_usage_hours FROM meters
WHERE ts >= '2024-09-22 06:00:00' AND ts < '2024-09-22 18:00:00'AND power > 500;
夜间用电时长
-- 夜间时段(19:00-05:00)的用电时长
SELECT ELAPSED(ts, 1h) AS nighttime_usage_hours FROM meters
WHERE ((ts >= '2024-09-22 19:00:00' AND ts <= '2024-09-22 23:59:59')OR (ts >= '2024-09-22 00:00:00' AND ts < '2024-09-22 06:00:00'))AND power > 100;
8. 数据质量监控
数据上报间隔检查
-- 检查数据上报的时间间隔是否正常
SELECT location,groupid,ELAPSED(ts, 1s) AS reporting_span_seconds,COUNT(*) AS record_count,ELAPSED(ts, 1s) / COUNT(*) AS avg_interval_seconds
FROM meters
WHERE ts >= NOW() - 1h
GROUP BY location, groupid;
数据完整性评估
-- 评估数据采集的完整性(理想情况下应该接近时间窗口长度)
SELECT ELAPSED(ts, 1h) AS actual_span_hours,24 AS expected_span_hours,ELAPSED(ts, 1h) / 24 * 100 AS completeness_percent
FROM meters
WHERE ts >= NOW() - 24h;
9. 与其他聚合函数组合
综合统计分析
-- 综合分析电表运行情况
SELECT location,COUNT(*) AS total_records,AVG(voltage) AS avg_voltage,AVG(current) AS avg_current,AVG(power) AS avg_power,ELAPSED(ts, 1h) AS monitoring_hours
FROM meters
WHERE ts >= NOW() - 24h
GROUP BY location;
性能指标统计
-- 电表性能综合评估
SELECT groupid,MIN(voltage) AS min_voltage,MAX(voltage) AS max_voltage,STDDEV(current) AS current_stability,ELAPSED(ts, 1d) AS monitoring_days
FROM meters
WHERE ts >= NOW() - 30d
GROUP BY groupid;
10. 嵌套查询应用
最长连续运行时间
-- 查找最长的连续数据采集时间
SELECT MAX(span_hours) AS max_continuous_hours
FROM (SELECT ELAPSED(ts, 1h) AS span_hours FROM meters WHERE voltage > 0 GROUP BY groupid, location
);
数据采集效率分析
-- 分析数据采集效率
SELECT location,AVG(collection_span) AS avg_collection_span_minutes
FROM (SELECT location,ELAPSED(ts, 1m) AS collection_spanFROM meters WHERE ts >= NOW() - 7dGROUP BY location, DATE(ts)
)
GROUP BY location;
实际应用价值
1. 运维管理
- 设备监控:通过 ELAPSED 分析设备在线时长和数据上报连续性
- 故障诊断:识别数据中断或异常的时间段
- 维护调度:基于设备运行时长制定维护计划
2. 电网管理
- 稳定性评估:分析电压、电流等参数的稳定持续时间
- 负荷管理:统计高负荷和低负荷的持续时间
- 质量监控:评估电网供电质量的时间分布
3. 数据治理
- 完整性检查:验证数据采集的时间连续性
- 质量评估:分析数据上报的及时性和规律性
- 异常检测:发现数据中断或采集异常
使用限制
1. 列限制
-- ❌ 错误用法:不能用于非时间戳列
SELECT ELAPSED(voltage) FROM meters;
SELECT ELAPSED(groupid) FROM meters;-- ✅ 正确用法:只能用于时间戳列
SELECT ELAPSED(ts) FROM meters;
2. 超级表
-- ✅ 正确用法:使用 PARTITION BY 或 GROUP BY
SELECT ELAPSED(ts) FROM meters PARTITION BY groupid, location;
3. 嵌套限制
-- ❌ 错误用法:不能嵌套在聚合函数中
SELECT AVG(ELAPSED(ts)) FROM meters;
SELECT ELAPSED(MAX(ts)) FROM meters;-- ✅ 正确用法:外层使用聚合函数
SELECT MAX(span_hours) FROM (SELECT ELAPSED(ts, 1h) AS span_hours FROM meters GROUP BY groupid
);
性能优化建议
1. 合理设置时间范围
-- 推荐:指定合适的时间范围
SELECT ELAPSED(ts, 1h) FROM meters
WHERE ts >= NOW() - 24h;-- 避免:过大的时间范围查询
SELECT ELAPSED(ts, 1h) FROM meters; -- 可能影响性能
2. 利用分区查询
-- 推荐:按标签分区提高效率
SELECT ELAPSED(ts, 1h) FROM meters
WHERE location = 'California.SanFrancisco'
PARTITION BY groupid;
3. 结合时间窗口
-- 推荐:使用 INTERVAL 进行时间窗口分析
SELECT ELAPSED(ts, 1s) FROM meters
WHERE ts >= NOW() - 7d
INTERVAL(1h);
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。