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 提供實時分析、可視化、事件管理與報警等功能。