TOP() 函数用户手册
函数定义
TOP(expr, k)
功能说明
TOP()
函数统计表/超级表中某列的值最大 k 个非 NULL 值。如果多条数据取值一样,全部取用又会超出 k 条限制时,系统会从相同值中随机选取符合要求的数量返回。
返回值
- 数据类型: 同应用的字段
- 返回内容: 最大的 k 个值及其对应的时间戳
参数说明
参数 | 类型 | 说明 | 取值范围 |
---|---|---|---|
expr | 数值类型 | 要统计的字段表达式 | 任意数值类型字段 |
k | INTEGER | 返回最大值的数量 | 1 ≤ k ≤ 100 |
适用数据类型
- 数值类型: TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL
适用范围
- 表类型: 表和超级表
- 查询支持: 不支持嵌套子查询
使用说明
- k 值限制: k 值取值范围为 1≤k≤100
- 时间戳返回: 系统同时返回该记录关联的时间戳列
- 相同值处理: 当存在相同最大值且超出 k 条限制时,系统随机选取
- NULL 值处理: 忽略 NULL 值,只统计非 NULL 值
- 限制条件: 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();
性能优化建议
- 时间范围限制: 使用适当的时间范围限制来提高查询性能
- 索引利用: 确保时间戳字段有适当的索引
- k值选择: 根据实际需求选择合适的k值,避免不必要的大值
- 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;
注意事项
- k值限制: k 值必须在 1-100 范围内
- 相同值处理: 当存在相同最大值时,系统会随机选取
- NULL值忽略: 函数自动忽略 NULL 值
- FILL限制: 不支持 FILL 子句
- 时间戳返回: 结果总是包含对应的时间戳
- 数据类型: 只适用于数值类型字段
- 内存使用: 较大的k值会消耗更多内存
相关函数
BOTTOM()
: 返回最小的 k 个值MAX()
: 返回最大值(不含时间戳)MIN()
: 返回最小值(不含时间戳)FIRST()
: 返回最早的值LAST()
: 返回最晚的值
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。