TDengine 选择函数 TOP

发布于:2025-09-13 ⋅ 阅读:(22) ⋅ 点赞:(0)

在这里插入图片描述

TOP() 函数用户手册

函数定义

TOP(expr, k)

功能说明

TOP() 函数统计表/超级表中某列的值最大 k 个非 NULL 值。如果多条数据取值一样,全部取用又会超出 k 条限制时,系统会从相同值中随机选取符合要求的数量返回。

返回值

  • 数据类型: 同应用的字段
  • 返回内容: 最大的 k 个值及其对应的时间戳

参数说明

参数 类型 说明 取值范围
expr 数值类型 要统计的字段表达式 任意数值类型字段
k INTEGER 返回最大值的数量 1 ≤ k ≤ 100

适用数据类型

  • 数值类型: TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL

适用范围

  • 表类型: 表和超级表
  • 查询支持: 不支持嵌套子查询

使用说明

  1. k 值限制: k 值取值范围为 1≤k≤100
  2. 时间戳返回: 系统同时返回该记录关联的时间戳列
  3. 相同值处理: 当存在相同最大值且超出 k 条限制时,系统随机选取
  4. NULL 值处理: 忽略 NULL 值,只统计非 NULL 值
  5. 限制条件: TOP 函数不支持 FILL 子句

基本用法示例

简单查询

-- 获取电流最大的3个值
SELECT TOP(current, 3) FROM meters;

-- 获取电压最大的5个值
SELECT TOP(voltage, 5) FROM meters;

-- 获取相位最大的1个值
SELECT TOP(phase, 1) FROM meters;

NULL 值处理

-- TOP 函数自动忽略 NULL 值
SELECT TOP(current, 10) FROM meters;
-- 只返回非 NULL 的最大值

智能电表场景应用示例

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

-- 数据库和表结构
USE test;
-- meters 超级表包含 ts, current, voltage, phase 字段和 location, groupid 标签

场景1:峰值负载监控 - 找出电流峰值记录

-- 查找电流最高的10个峰值记录
SELECT TOP(current, 10) FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-02-01';

-- 输出结果包含时间戳和电流值,便于分析峰值出现时间

场景2:按区域查找最高电压

-- 查找每个区域电压最高的5个记录
SELECT location, TOP(voltage, 5) FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'
GROUP BY location;

场景3:电网容量分析 - 最高负载记录

-- 查找电流最高的15个记录,用于容量规划
SELECT TOP(current, 15) FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'
    AND location = 'California.SanFrancisco';

场景4:过载保护 - 多指标峰值分析

-- 分别查找各项指标的峰值
-- 电流峰值的3个记录
SELECT 'current' as metric, ts, current as value 
FROM (SELECT TOP(current, 3) FROM meters WHERE ts >= TODAY() - 7d);

-- 电压峰值的3个记录  
SELECT 'voltage' as metric, ts, voltage as value
FROM (SELECT TOP(voltage, 3) FROM meters WHERE ts >= TODAY() - 7d);

-- 相位峰值的3个记录
SELECT 'phase' as metric, ts, phase as value
FROM (SELECT TOP(phase, 3) FROM meters WHERE ts >= TODAY() - 7d);

场景5:高峰时段分析

-- 查找工作日高峰时段的最大电流记录
SELECT TOP(current, 20) FROM meters 
WHERE ts >= '2024-01-01 08:00:00' AND ts <= '2024-01-01 20:00:00'
    AND WEEKDAY(ts) NOT IN (5, 6);  -- 排除周末

场景6:电网安全 - 过载风险识别

-- 查找电流最高的25个记录,识别过载风险
SELECT location, TOP(current, 25) FROM meters 
WHERE ts >= TODAY() - 30d  -- 最近30天
    AND current > 18.0  -- 高电流阈值
GROUP BY location;

场景7:电压质量监控 - 过电压检测

-- 查找电压最高的记录,检测过电压情况
SELECT TOP(voltage, 20) FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'
    AND voltage > 240;  -- 过电压阈值

场景8:按设备组查找峰值

-- 按设备组查找电流峰值记录
SELECT groupid, TOP(current, 8) FROM meters 
WHERE ts >= TODAY() - 14d  -- 最近两周
GROUP BY groupid;

场景9:需求响应 - 峰值负载时段

-- 查找电流峰值时段,用于需求响应程序
SELECT TOP(current, 30) FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-01-08'
    AND WEEKDAY(ts) NOT IN (5, 6)  -- 工作日
    AND (HOUR(ts) BETWEEN 9 AND 11 OR HOUR(ts) BETWEEN 14 AND 17);  -- 高峰时段

场景10:设备性能评估 - 最大输出监控

-- 监控各区域的最大输出性能
SELECT location, TOP(current, 12) FROM meters 
WHERE ts >= TODAY() - 7d
GROUP BY location
ORDER BY location;

场景11:负载预测 - 历史峰值分析

-- 分析历史峰值数据,为负载预测提供依据
SELECT 
    location,
    WEEKOFYEAR(ts) as week_of_year,
    TOP(current, 5) 
FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-04-01'
GROUP BY location, WEEKOFYEAR(ts)
ORDER BY week_of_year, location;

场景12:告警系统 - 高负载预警

-- 设置高负载告警,监控异常高的电流值
SELECT 
    location,
    'HIGH_CURRENT_ALERT' as alert_type,
    TOP(current, 3) 
FROM meters 
WHERE ts >= NOW() - INTERVAL 1 HOUR
    AND current > 20.0  -- 高电流告警阈值
GROUP BY location;

场景13:电网调度 - 峰谷差分析

-- 分析同一时段的峰值分布
SELECT 
    HOUR(ts) as hour_of_day,
    location,
    TOP(current, 5)
FROM meters 
WHERE ts >= TODAY() - 7d
    AND HOUR(ts) IN (9, 12, 15, 18, 21)  -- 特定时段
GROUP BY HOUR(ts), location
ORDER BY hour_of_day, location;

场景14:容量规划 - 最大需求分析

-- 分析各区域的最大电力需求
SELECT 
    location,
    'MAX_DEMAND' as analysis_type,
    TOP(current, 10)
FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'
GROUP BY location;

场景15:设备维护 - 高负载设备识别

-- 识别经常处于高负载状态的设备
SELECT location, TOP(current, 50) FROM meters 
WHERE ts >= TODAY() - 30d
    AND current > 15.0  -- 高负载阈值
GROUP BY location
HAVING COUNT(*) > 100;  -- 频繁高负载的设备

与其他函数的对比

TOP vs BOTTOM

-- 电流最高的5个值
SELECT 'TOP' as type, TOP(current, 5) FROM meters 
WHERE ts >= TODAY();

-- 电流最低的5个值
SELECT 'BOTTOM' as type, BOTTOM(current, 5) FROM meters 
WHERE ts >= TODAY();

TOP vs MAX

-- MAX 只返回最大值,不返回时间戳
SELECT MAX(current) FROM meters WHERE ts >= TODAY();

-- TOP 返回最大的k个值及其时间戳
SELECT TOP(current, 1) FROM meters WHERE ts >= TODAY();

性能优化建议

  1. 时间范围限制: 使用适当的时间范围限制来提高查询性能
  2. 索引利用: 确保时间戳字段有适当的索引
  3. k值选择: 根据实际需求选择合适的k值,避免不必要的大值
  4. WHERE条件: 合理使用WHERE条件过滤数据

实际应用建议

电网监控应用

-- 实时监控最近1小时的电流峰值
SELECT 
    location,
    'REAL_TIME_PEAK' as monitor_type,
    TOP(current, 3)
FROM meters 
WHERE ts >= NOW() - INTERVAL 1 HOUR
GROUP BY location;

历史数据分析

-- 分析历史同期的峰值模式
SELECT 
    WEEKOFYEAR(ts) as week_number,
    location,
    TOP(current, 5)
FROM meters 
WHERE ts >= '2024-01-01' AND ts < '2024-12-31'
    AND WEEKOFYEAR(ts) IN (20, 21, 22)  -- 特定周数
GROUP BY WEEKOFYEAR(ts), location;

注意事项

  1. k值限制: k 值必须在 1-100 范围内
  2. 相同值处理: 当存在相同最大值时,系统会随机选取
  3. NULL值忽略: 函数自动忽略 NULL 值
  4. FILL限制: 不支持 FILL 子句
  5. 时间戳返回: 结果总是包含对应的时间戳
  6. 数据类型: 只适用于数值类型字段
  7. 内存使用: 较大的k值会消耗更多内存

相关函数

  • BOTTOM(): 返回最小的 k 个值
  • MAX(): 返回最大值(不含时间戳)
  • MIN(): 返回最小值(不含时间戳)
  • FIRST(): 返回最早的值
  • LAST(): 返回最晚的值

关于 TDengine

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


网站公告

今日签到

点亮在社区的每一天
去签到