在这里插入图片描述

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;

注意事项

  1. 参数范围: k 值取值范围为 [1, 100],offset_rows 取值范围为 [0, 100]
  2. NULL 值处理: TAIL 函数不忽略 NULL 值,会包含在返回结果中
  3. 数据类型限制: 不能用于时间主键列
  4. 返回顺序: 返回的记录按照时间戳倒序排列(最新的在前)
  5. 性能考虑: 在大表上使用时建议配合适当的 WHERE 条件过滤
  6. 分组查询: 与 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 提供实时分析、可视化、事件管理与报警等功能。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐