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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
执笔画情ora13 小时前
oracle数据库优化-表碎片优化性能。
数据库·oracle
XiaoMu_00113 小时前
基于大数据的糖尿病数据分析可视化
大数据·数据挖掘·数据分析
架构师沉默13 小时前
Java 终于有自己的 AI Agent 框架了?
java·后端·架构
程序员爱酸奶13 小时前
ThreadLocal内存泄漏深度解析
java
givemeacar13 小时前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
skiy13 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
czlczl2002092513 小时前
JVM创建对象过程
java·开发语言
IvorySQL13 小时前
PostgreSQL 技术日报 (3月24日)|当 MVCC 成本被重新审视
数据库·postgresql·开源
阿里云大数据AI技术13 小时前
Celeborn 如何让 EMR Serverless Spark 的 Shuffle 舒心、放心、安心
大数据·spark
2401_8955213414 小时前
PostgreSQL_安装部署
数据库·postgresql