UNIQUE 函數用戶手冊
函數定義
UNIQUE(expr)
功能說明
UNIQUE()
函數返回指定列去重后的值,功能類似于 SQL 中的 DISTINCT 關鍵字。對于相同的數據值,UNIQUE 函數會返回時間戳最小的那一條記錄。該函數會跳過 NULL 值。
版本要求
- 最低版本: v3.0.0.0
返回值
- 數據類型: 與輸入參數相同的數據類型
- 返回內容: 去重后的值集合及其對應的時間戳
參數說明
參數 | 類型 | 說明 | 取值范圍 |
---|---|---|---|
expr | 表達式 | 要去重的字段表達式 | 所有數據類型 |
適用數據類型
UNIQUE 函數支持以下數據類型:
- 所有數據類型: 數值類型、字符串類型、時間戳類型、布爾類型等
適用范圍
- 表類型: 表和超級表
- 查詢支持: 支持選擇查詢、多行返回
- 函數特性: 選擇函數、多行函數、隱式時間戳函數、主鍵函數
基本用法示例
單列查詢
-- 返回電流的所有不同值
SELECT UNIQUE(current) FROM meters;-- 返回電壓的所有不同值
SELECT UNIQUE(voltage) FROM meters;-- 返回相位的所有不同值
SELECT UNIQUE(phase) FROM meters;
帶時間戳查詢
-- 返回電流不同值及其首次出現的時間戳
SELECT ts,UNIQUE(current) as unique_current_values
FROM meters;
帶其他列查詢
-- 返回包含標簽信息的 UNIQUE 查詢
SELECT location,UNIQUE(current) as unique_current,ts
FROM meters;
智能電表場景應用示例
基于智能電表數據庫結構:
-- 數據庫和表結構
USE test;
-- meters 超級表包含 ts, current, voltage, phase 字段和 location, groupid 標簽
場景1:全局數據去重分析
-- 查看所有電表記錄過的不同電流值
SELECT UNIQUE(current) as current_levels FROM meters;-- 查看所有電表記錄過的不同電壓值
SELECT UNIQUE(voltage) as voltage_levels FROM meters;-- 查看所有電表記錄過的不同相位值
SELECT UNIQUE(phase) as phase_levels FROM meters;
場景2:單個電表數據去重
-- 查看特定電表的不同電流使用模式
SELECT UNIQUE(current) as device_current_patterns,ts as first_occurrence
FROM meters
WHERE tbname = 'd1001';-- 查看特定電表的不同電壓模式
SELECT UNIQUE(voltage) as device_voltage_patterns,ts as first_occurrence
FROM meters
WHERE tbname = 'd1001';
場景3:區域數據去重分析
-- 查看北京地區電表的不同電流值
SELECT location,UNIQUE(current) as regional_current_patterns,ts as first_occurrence
FROM meters
WHERE location = 'Beijing';-- 查看上海地區電表的不同電壓值
SELECT location,UNIQUE(voltage) as regional_voltage_patterns,ts as first_occurrence
FROM meters
WHERE location = 'Shanghai';
場景4:時間段內的數據去重
-- 分析最近一周的用電模式變化
SELECT UNIQUE(current) as weekly_current_patterns,ts as pattern_first_seen
FROM meters
WHERE ts >= NOW() - 7d;-- 分析工作日的用電模式
SELECT UNIQUE(current) as weekday_patterns,ts as pattern_start_time
FROM meters
WHERE WEEKDAY(ts) BETWEEN 1 AND 5;
場景5:負載檔位分析
-- 分析所有電表的負載檔位(去重后的電流值)
SELECT UNIQUE(current) as load_levels,ts as level_first_seen
FROM meters
ORDER BY load_levels;-- 分析高負載時段的電流模式
SELECT UNIQUE(current) as high_load_patterns,ts as high_load_first_time
FROM meters
WHERE current > 20;
場景6:電力質量標準檢測
-- 檢測系統中出現過的電壓標準
SELECT UNIQUE(voltage) as voltage_standards,ts as standard_first_detected
FROM meters
ORDER BY voltage_standards;-- 檢測異常電壓值
SELECT UNIQUE(voltage) as abnormal_voltages,ts as anomaly_first_detected
FROM meters
WHERE voltage < 200 OR voltage > 250;
場景7:設備特定分析
-- 分析特定設備組的運行特征
SELECT UNIQUE(current) as group_current_patterns,ts as pattern_first_occurrence
FROM meters
WHERE groupid = 1;-- 分析特定設備的電氣特征
SELECT UNIQUE(current) as device_current_signature,UNIQUE(voltage) as device_voltage_signature,ts as signature_timestamp
FROM meters
WHERE tbname = 'd1001';
場景8:數據質量檢查
-- 檢查最近記錄中的數據完整性
SELECT UNIQUE(current) as recent_current_values,ts as value_first_seen
FROM meters
WHERE ts >= NOW() - 1h;-- 檢查數據的離散程度
SELECT COUNT(UNIQUE(current)) as current_diversity,MAX(ts) as latest_record
FROM meters;
場景9:異常檢測數據準備
-- 獲取異常電流值用于分析
SELECT UNIQUE(current) as abnormal_current,ts as anomaly_first_time
FROM meters
WHERE current > 30 OR current < 0;-- 獲取系統中的所有相位值
SELECT UNIQUE(phase) as phase_variations,ts as variation_first_detected
FROM meters;
場景10:基準值建立
-- 建立電流基準值庫
SELECT UNIQUE(current) as current_baselines,ts as baseline_established
FROM meters
WHERE ts >= NOW() - 30d;-- 建立電壓基準值庫
SELECT UNIQUE(voltage) as voltage_baselines,ts as baseline_timestamp
FROM meters
WHERE voltage BETWEEN 200 AND 240;
場景11:設備運行模式識別
-- 識別設備的不同運行模式(基于電流值)
SELECT UNIQUE(current) as operating_modes,ts as mode_first_detected
FROM meters
WHERE tbname IN ('d1001', 'd1002', 'd1003');-- 識別低功耗模式
SELECT UNIQUE(current) as low_power_modes,ts as mode_detected_time
FROM meters
WHERE current < 5;
場景12:歷史數據模式分析
-- 分析歷史數據中的電流模式
SELECT UNIQUE(current) as historical_patterns,ts as pattern_origin_time
FROM meters
WHERE ts BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59';-- 分析夜間用電模式
SELECT UNIQUE(current) as night_patterns,ts as night_pattern_time
FROM meters
WHERE HOUR(ts) BETWEEN 22 AND 6;
與傳統 DISTINCT 的對比
-- UNIQUE 函數方式(推薦,返回時間戳信息)
SELECT UNIQUE(current) as unique_current,ts
FROM meters
WHERE tbname = 'd1001';-- 傳統 DISTINCT 方式(只返回去重值)
SELECT DISTINCT current
FROM meters
WHERE tbname = 'd1001';
注意事項
- NULL 值處理: UNIQUE 函數會跳過 NULL 值,不會包含在返回結果中
- 時間戳選擇: 對于相同的值,返回時間戳最小的那一條記錄
- 多行返回: UNIQUE 函數會返回多行結果
- 必須包含列: 參數必須包含列引用,不能是純常量表達式
- 隱式時間戳: 函數會隱式返回對應的時間戳信息
- 不支持分組: UNIQUE 函數不能在 GROUP BY 查詢中使用
- 不支持窗口: UNIQUE 函數不能在窗口查詢中使用
- 性能考慮: 在大表上使用時建議配合適當的 WHERE 條件過濾
相關函數
- MODE(): 返回出現頻率最高的值
- SAMPLE(): 返回隨機采樣的 k 個值
- TOP(): 返回最大的 k 個值
- BOTTOM(): 返回最小的 k 個值
- FIRST(): 返回最先的非 NULL 值
- LAST(): 返回最后的非 NULL 值
關于 TDengine
TDengine 專為物聯網IoT平臺、工業大數據平臺設計。其中,TDengine TSDB 是一款高性能、分布式的時序數據庫(Time Series Database),同時它還帶有內建的緩存、流式計算、數據訂閱等系統功能;TDengine IDMP 是一款AI原生工業數據管理平臺,它通過樹狀層次結構建立數據目錄,對數據進行標準化、情景化,并通過 AI 提供實時分析、可視化、事件管理與報警等功能。