TDengine 选择函数 TAIL() 用户手册
功能说明:返回跳过最后 offset_val 个,然后取连续 k 个记录,不忽略 NULL 值。offset_val 可以不输入。此时返回最后的 k 个记录。当有 offset_val 输入的情况下,该函数功能等效于 order by ts desc LIMIT k OFFSET offset_val。
·
TAIL 函数用户手册
函数定义
TAIL(expr, k [, offset_rows])
功能说明
TAIL()
函数返回跳过最后 offset_rows 个记录,然后取连续 k 个记录,不忽略 NULL 值。offset_rows 可以不输入,此时返回最后的 k 个记录。当有 offset_rows 输入的情况下,该函数功能等效于 ORDER BY ts DESC LIMIT k OFFSET offset_rows
。
版本要求
- 最低版本: v3.0.0.0
返回值
- 数据类型: 与输入参数相同的数据类型
- 返回内容: 符合条件的最后 k 条记录
参数说明
参数 | 类型 | 说明 | 取值范围 |
---|---|---|---|
expr | 表达式 | 要查询的字段表达式 | 除时间主键列外的任何类型 |
k | 整数 | 要返回的记录数量 | [1, 100] |
offset_rows | 整数 | 要跳过的记录数量(可选) | [0, 100] |
适用数据类型
根据源码分析,TAIL 函数支持以下数据类型:
- 所有数据类型: 除时间主键列外的任何类型
- NULL 值: 不忽略 NULL 值,会包含在结果中
适用范围
- 表类型: 表和超级表
- 查询支持: 支持选择查询、多行返回
- 函数特性: 选择函数、多行函数、隐式时间戳函数
基本用法示例
基本语法
-- 返回最后 5 条记录
SELECT TAIL(current, 5) FROM meters;
-- 跳过最后 2 条记录,然后返回之前的 3 条记录
SELECT TAIL(voltage, 3, 2) FROM meters;
-- 返回最后 10 条记录的相位值
SELECT TAIL(phase, 10) FROM meters;
多列查询
-- 返回多个字段的最后 5 条记录
SELECT
TAIL(current, 5) as tail_current,
TAIL(voltage, 5) as tail_voltage,
TAIL(phase, 5) as tail_phase
FROM meters;
与时间戳结合
-- 返回最后 5 条记录及其时间戳
SELECT
ts,
TAIL(current, 5) as last_current
FROM meters;
智能电表场景应用示例
基于智能电表数据库结构:
-- 数据库和表结构
USE test;
-- meters 超级表包含 ts, current, voltage, phase 字段和 location, groupid 标签
场景1:获取最新数据
-- 获取每个电表的最后 10 条电流记录
SELECT
tbname,
TAIL(current, 10) as recent_current,
TAIL(ts, 10) as record_times
FROM meters
GROUP BY tbname;
场景2:数据质量检查
-- 检查最近 5 条记录中的数据完整性
SELECT
tbname,
location,
TAIL(current, 5) as recent_current,
TAIL(voltage, 5) as recent_voltage,
TAIL(phase, 5) as recent_phase
FROM meters
GROUP BY tbname, location;
场景3:异常检测
-- 获取最近 20 条记录用于异常检测
SELECT
tbname,
location,
TAIL(current, 20) as current_history,
TAIL(voltage, 20) as voltage_history
FROM meters
GROUP BY tbname, location
ORDER BY tbname;
场景4:跳过最新记录的分析
-- 跳过最后 5 条记录,获取之前的 10 条记录
-- 用于排除可能的异常最新数据
SELECT
tbname,
TAIL(current, 10, 5) as stable_current,
TAIL(voltage, 10, 5) as stable_voltage
FROM meters
GROUP BY tbname;
场景5:按区域分析历史数据
-- 获取每个区域最近的记录样本
SELECT
location,
TAIL(current, 15) as regional_current_sample,
TAIL(voltage, 15) as regional_voltage_sample
FROM meters
GROUP BY location;
场景6:负载趋势分析
-- 获取最近 30 条记录用于负载趋势分析
SELECT
tbname,
location,
TAIL(current, 30) as load_trend_data,
TAIL(ts, 30) as trend_timestamps
FROM meters
GROUP BY tbname, location
HAVING COUNT(*) >= 30; -- 只返回有足够数据的设备
场景7:设备状态监控
-- 获取最近记录,排除最新的 3 条(可能包含传输中的数据)
SELECT
tbname,
location,
TAIL(current, 5, 3) as confirmed_current,
TAIL(voltage, 5, 3) as confirmed_voltage,
TAIL(phase, 5, 3) as confirmed_phase
FROM meters
GROUP BY tbname, location;
场景8:数据采样
-- 获取不同时间段的数据样本
-- 最近的数据样本
SELECT
'latest' as sample_type,
location,
TAIL(current, 10) as current_sample
FROM meters
GROUP BY location
UNION ALL
-- 跳过最近 50 条,获取更早的样本
SELECT
'earlier' as sample_type,
location,
TAIL(current, 10, 50) as current_sample
FROM meters
GROUP BY location;
场景9:设备性能评估
-- 获取最近的性能数据进行评估
SELECT
tbname,
location,
TAIL(current, 20) as performance_current,
TAIL(voltage, 20) as performance_voltage,
COUNT(*) as total_records
FROM meters
GROUP BY tbname, location
ORDER BY location, tbname;
场景10:故障诊断数据准备
-- 为故障诊断准备最近的设备数据
SELECT
tbname,
location,
groupid,
TAIL(current, 25) as diagnostic_current,
TAIL(voltage, 25) as diagnostic_voltage,
TAIL(phase, 25) as diagnostic_phase,
TAIL(ts, 25) as diagnostic_timestamps
FROM meters
WHERE location = 'Beijing' -- 特定区域的设备
GROUP BY tbname, location, groupid;
与 ORDER BY LIMIT 的对比
-- TAIL 函数方式
SELECT TAIL(current, 5) FROM meters WHERE tbname = 'meter001';
-- 等效的 ORDER BY LIMIT 方式
SELECT current FROM meters
WHERE tbname = 'meter001'
ORDER BY ts DESC
LIMIT 5;
-- 带偏移的 TAIL 函数
SELECT TAIL(current, 3, 2) FROM meters WHERE tbname = 'meter001';
-- 等效的 ORDER BY LIMIT OFFSET 方式
SELECT current FROM meters
WHERE tbname = 'meter001'
ORDER BY ts DESC
LIMIT 3 OFFSET 2;
注意事项
- 参数范围: k 值取值范围为 [1, 100],offset_rows 取值范围为 [0, 100]
- NULL 值处理: TAIL 函数不忽略 NULL 值,会包含在返回结果中
- 数据类型限制: 不能用于时间主键列
- 返回顺序: 返回的记录按照时间戳倒序排列(最新的在前)
- 性能考虑: 在大表上使用时建议配合适当的 WHERE 条件过滤
- 分组查询: 与 GROUP BY 配合使用时,每个分组返回各自的最后 k 条记录
相关函数
- FIRST(): 返回最先写入的非 NULL 值
- LAST(): 返回最后写入的非 NULL 值
- LAST_ROW(): 返回最后一条记录
- TOP(): 返回最大的 k 个值
- BOTTOM(): 返回最小的 k 个值
- SAMPLE(): 返回随机采样的 k 个值
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
更多推荐
所有评论(0)