TDengine 聚合函数 ELAPSED 用户手册

ELAPSED 函数用户手册

函数概述

ELAPSED 函数是 TDengine 中的聚合函数,用于计算查询时间范围内数据的时间跨度。该函数只能应用于主键时间戳列,返回第一条记录与最后一条记录之间的时间差。在智能电表场景中,常用于分析用电持续时间、数据采集间隔、设备运行周期等。

基本语法

sql 复制代码
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
  • 当查询结果有多条记录时,返回时间跨度(按指定单位)

智能电表应用场景

基于智能电表数据库结构:

sql 复制代码
CREATE TABLE meters (
    ts TIMESTAMP,
    voltage FLOAT,
    current FLOAT,
    power FLOAT
) TAGS (
    groupid INT,
    location VARCHAR(50)
);

1. 基本用法

sql 复制代码
-- 计算电表数据的时间跨度(秒)
SELECT ELAPSED(ts) FROM meters;

-- 指定时间单位为分钟
SELECT ELAPSED(ts, 1m) FROM meters;

-- 指定时间单位为小时  
SELECT ELAPSED(ts, 1h) FROM meters;

-- 指定时间单位为天
SELECT ELAPSED(ts, 1d) FROM meters;

2. 电表数据采集监控

数据采集时间跨度分析
sql 复制代码
-- 计算过去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;
按设备组分析采集情况
sql 复制代码
-- 各设备组数据采集时间跨度
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. 用电持续时间分析

高负荷用电时长统计
sql 复制代码
-- 计算功率超过阈值的持续时间
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;
异常用电持续时间
sql 复制代码
-- 电压异常的持续时间分析
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. 时间窗口分析

每小时数据跨度监控
sql 复制代码
-- 每小时内数据的时间跨度
SELECT ELAPSED(ts, 1s) AS hourly_span_seconds 
FROM meters 
WHERE ts >= NOW() - 24h
INTERVAL(1h);
每日数据完整性检查
sql 复制代码
-- 每日数据采集的时间跨度
SELECT ELAPSED(ts, 1h) AS daily_data_hours
FROM meters 
WHERE ts >= NOW() - 30d
INTERVAL(1d);

5. 设备运行状态分析

设备在线时长统计
sql 复制代码
-- 计算各电表设备的在线时长(基于数据上报)
SELECT ELAPSED(ts, 1h) AS online_hours FROM meters 
WHERE ts >= NOW() - 7d
PARTITION BY groupid, location;
连续运行时间分析
sql 复制代码
-- 电表连续正常运行时间(电压在正常范围内)
SELECT ELAPSED(ts, 1d) AS normal_operation_days FROM meters 
WHERE voltage BETWEEN 210 AND 240 
  AND current > 0 
  AND ts >= NOW() - 90d;

6. 电网稳定性监控

电压稳定期分析
sql 复制代码
-- 电压在稳定范围内的持续时间
SELECT 
    location,
    ELAPSED(ts, 1h) AS stable_voltage_hours
FROM meters 
WHERE voltage BETWEEN 218 AND 222 
  AND ts >= NOW() - 7d
GROUP BY location;
负载稳定时长统计
sql 复制代码
-- 功率在正常范围内的持续时间
SELECT ELAPSED(ts, 1m) AS stable_power_minutes FROM meters 
WHERE power BETWEEN 1000 AND 8000 
  AND ts >= NOW() - 24h;

7. 用电模式分析

白天用电时长
sql 复制代码
-- 白天时段(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;
夜间用电时长
sql 复制代码
-- 夜间时段(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. 数据质量监控

数据上报间隔检查
sql 复制代码
-- 检查数据上报的时间间隔是否正常
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;
数据完整性评估
sql 复制代码
-- 评估数据采集的完整性(理想情况下应该接近时间窗口长度)
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. 与其他聚合函数组合

综合统计分析
sql 复制代码
-- 综合分析电表运行情况
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;
性能指标统计
sql 复制代码
-- 电表性能综合评估
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. 嵌套查询应用

最长连续运行时间
sql 复制代码
-- 查找最长的连续数据采集时间
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
);
数据采集效率分析
sql 复制代码
-- 分析数据采集效率
SELECT 
    location,
    AVG(collection_span) AS avg_collection_span_minutes
FROM (
    SELECT 
        location,
        ELAPSED(ts, 1m) AS collection_span
    FROM meters 
    WHERE ts >= NOW() - 7d
    GROUP BY location, DATE(ts)
) 
GROUP BY location;

实际应用价值

1. 运维管理

  • 设备监控:通过 ELAPSED 分析设备在线时长和数据上报连续性
  • 故障诊断:识别数据中断或异常的时间段
  • 维护调度:基于设备运行时长制定维护计划

2. 电网管理

  • 稳定性评估:分析电压、电流等参数的稳定持续时间
  • 负荷管理:统计高负荷和低负荷的持续时间
  • 质量监控:评估电网供电质量的时间分布

3. 数据治理

  • 完整性检查:验证数据采集的时间连续性
  • 质量评估:分析数据上报的及时性和规律性
  • 异常检测:发现数据中断或采集异常

使用限制

1. 列限制

sql 复制代码
-- ❌ 错误用法:不能用于非时间戳列
SELECT ELAPSED(voltage) FROM meters;
SELECT ELAPSED(groupid) FROM meters;

-- ✅ 正确用法:只能用于时间戳列
SELECT ELAPSED(ts) FROM meters;

2. 超级表

sql 复制代码
-- ✅ 正确用法:使用 PARTITION BY 或 GROUP BY
SELECT ELAPSED(ts) FROM meters PARTITION BY groupid, location;

3. 嵌套限制

sql 复制代码
-- ❌ 错误用法:不能嵌套在聚合函数中
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. 合理设置时间范围

sql 复制代码
-- 推荐:指定合适的时间范围
SELECT ELAPSED(ts, 1h) FROM meters 
WHERE ts >= NOW() - 24h;

-- 避免:过大的时间范围查询
SELECT ELAPSED(ts, 1h) FROM meters;  -- 可能影响性能

2. 利用分区查询

sql 复制代码
-- 推荐:按标签分区提高效率
SELECT ELAPSED(ts, 1h) FROM meters 
WHERE location = 'California.SanFrancisco'
PARTITION BY groupid;

3. 结合时间窗口

sql 复制代码
-- 推荐:使用 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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
我不是混子3 小时前
数据误删了咋办?别怕,今天来教你如何恢复数据
java·后端
zjjuejin3 小时前
Maven 最佳实践与性能优化
java·后端·maven
TDengine (老段)3 小时前
TDengine 聚合函数 HYPERLOGLOG 用户手册
大数据·数据库·物联网·哈希算法·时序数据库·iot·tdengine
卷Java3 小时前
WXML 编译错误修复总结
xml·java·前端·微信小程序·uni-app·webview
Elastic 中国社区官方博客3 小时前
使用 Elasticsearch 构建 AI Agentic 工作流
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
kobe_OKOK_3 小时前
django 使用绑定多个数据库实现数据的同步
数据库·python·django
Yilena3 小时前
跟进 JDK25:将虚拟线程安全引入生产的权衡与实战
java·开发语言·虚拟线程·结构化并发·jdk25
_extraordinary_3 小时前
Java HTTP协议(二)--- HTTPS,Tomcat
java·http·https