BOTTOM() 函数用户手册
函数定义
BOTTOM(expr, k)
功能说明
BOTTOM()
函数统计表/超级表中某列的值最小 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 值
- 限制条件: BOTTOM 函数不支持 FILL 子句
基本用法示例
简单查询
-- 获取电流最小的3个值
SELECT BOTTOM(current, 3) FROM meters;-- 获取电压最小的5个值
SELECT BOTTOM(voltage, 5) FROM meters;-- 获取相位最小的1个值
SELECT BOTTOM(phase, 1) FROM meters;
NULL 值处理
-- BOTTOM 函数自动忽略 NULL 值
SELECT BOTTOM(current, 10) FROM meters;
-- 只返回非 NULL 的最小值
智能电表场景应用示例
基于智能电表数据库结构:
-- 数据库和表结构
USE test;
-- meters 超级表包含 ts, current, voltage, phase 字段和 location, groupid 标签
场景1:故障诊断 - 找出电流异常低的记录
-- 查找电流最低的10个异常记录
SELECT BOTTOM(current, 10) FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-02-01';-- 输出结果包含时间戳和电流值,便于定位异常时间点
场景2:按区域查找最低电压
-- 查找每个区域电压最低的5个记录
SELECT location, BOTTOM(voltage, 5) FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'
GROUP BY location;
场景3:设备性能分析 - 最低相位记录
-- 查找相位最低的8个记录,用于分析设备性能
SELECT BOTTOM(phase, 8) 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 BOTTOM(current, 3) FROM meters WHERE ts >= TODAY() - 7d);-- 电压最低的3个值
SELECT 'voltage' as metric, ts, voltage as value
FROM (SELECT BOTTOM(voltage, 3) FROM meters WHERE ts >= TODAY() - 7d);-- 相位最低的3个值
SELECT 'phase' as metric, ts, phase as value
FROM (SELECT BOTTOM(phase, 3) FROM meters WHERE ts >= TODAY() - 7d);
场景5:按时间段查找异常低值
-- 查找工作时间内电流最低的记录(可能表示设备故障)
SELECT BOTTOM(current, 15) FROM meters
WHERE ts >= '2024-01-01 08:00:00' AND ts <= '2024-01-01 18:00:00'AND WEEKDAY(ts) NOT IN (5, 6); -- 排除周末
场景6:设备维护 - 识别性能下降的电表
-- 查找电压最低的20个记录,可能需要维护
SELECT location, BOTTOM(voltage, 20) FROM meters
WHERE ts >= TODAY() - 30d -- 最近30天
GROUP BY location;
场景7:电网稳定性分析 - 相位异常检测
-- 查找相位值异常低的记录(接近0或负值)
SELECT BOTTOM(phase, 25) FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'AND phase < 0.1; -- 相位值异常低
场景8:按设备组查找最低值
-- 按设备组查找电流最低的记录
SELECT groupid, BOTTOM(current, 12) FROM meters
WHERE ts >= TODAY() - 14d -- 最近两周
GROUP BY groupid;
场景9:负载分析 - 最低负载时段识别
-- 查找电流最低的时段,用于负载调度参考
SELECT BOTTOM(current, 30) FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-01-08'AND WEEKDAY(ts) IN (5, 6); -- 只看周末的低负载
场景10:质量控制 - 电压质量监控
-- 监控电压质量,找出可能的电压跌落
SELECT location, BOTTOM(voltage, 10) FROM meters
WHERE ts >= TODAY() - 7dAND voltage < 200 -- 电压异常低的阈值
GROUP BY location;
场景11:结合其他函数进行综合分析
-- 对比最高值和最低值的差异
-- 注意:这需要分别执行两个查询
-- 查询最低电流值
SELECT 'BOTTOM' as type, BOTTOM(current, 5) FROM meters
WHERE ts >= TODAY() - 1d;-- 查询最高电流值
SELECT 'TOP' as type, TOP(current, 5) FROM meters
WHERE ts >= TODAY() - 1d;
场景12:告警系统 - 异常低值监控
-- 设置告警条件,监控异常低的电流值
SELECT location,'LOW_CURRENT_ALERT' as alert_type,BOTTOM(current, 3)
FROM meters
WHERE ts >= NOW() - INTERVAL 1 HOURAND current < 5.0 -- 电流异常低的阈值
GROUP BY location;
与其他函数的对比
BOTTOM vs TOP
-- 电流最低的5个值
SELECT 'BOTTOM' as type, BOTTOM(current, 5) FROM meters
WHERE ts >= TODAY();-- 电流最高的5个值
SELECT 'TOP' as type, TOP(current, 5) FROM meters
WHERE ts >= TODAY();
BOTTOM vs MIN
-- MIN 只返回最小值,不返回时间戳
SELECT MIN(current) FROM meters WHERE ts >= TODAY();-- BOTTOM 返回最小的k个值及其时间戳
SELECT BOTTOM(current, 1) FROM meters WHERE ts >= TODAY();
性能优化建议
- 时间范围限制: 使用适当的时间范围限制来提高查询性能
- 索引利用: 确保时间戳字段有适当的索引
- k值选择: 根据实际需求选择合适的k值,避免不必要的大值
- WHERE条件: 合理使用WHERE条件过滤数据
注意事项
- k值限制: k 值必须在 1-100 范围内
- 相同值处理: 当存在相同最小值时,系统会随机选取
- NULL值忽略: 函数自动忽略 NULL 值
- FILL限制: 不支持 FILL 子句
- 时间戳返回: 结果总是包含对应的时间戳
- 数据类型: 只适用于数值类型字段
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。