TDengine 特殊选择函数 UNIQUE 用户手册
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 提供实时分析、可视化、事件管理与报警等功能。