TDengine GREATEST 和 LEAST 函数用户手册

在这里插入图片描述

TDengine GREATEST 和 LEAST 函数用户手册

1. 需求背景

1.1 问题描述

在实际生产过程中,客户经常需要计算三相电流、电压的最大值和最小值。传统的实现方式需要使用复杂的 CASE WHEN 语句,例如:

-- 传统方式:计算三相电流最大值
SELECT ts,CASE WHEN current_a >= current_b AND current_a >= current_c THEN current_aWHEN current_b >= current_a AND current_b >= current_c THEN current_bELSE current_cEND AS max_current
FROM power_meter;-- 传统方式:计算三相电压最小值
SELECT ts,CASE WHEN voltage_a <= voltage_b AND voltage_a <= voltage_c THEN voltage_aWHEN voltage_b <= voltage_a AND voltage_b <= voltage_c THEN voltage_bELSE voltage_cEND AS min_voltage
FROM power_meter;

1.2 存在的问题

  1. 语句冗长:每次比较多个字段需要编写大量的 CASE WHEN 逻辑
  2. 效率低下:复杂的条件判断影响查询性能
  3. 可读性差:代码难以理解和维护
  4. 易出错:复杂的逻辑容易产生错误

1.3 解决方案

新增跨字段求最大、最小值的函数 GREATESTLEAST,用于替代复杂的 CASE WHEN 语句,提供更简洁、高效的解决方案。

2. 函数语法

2.1 GREATEST 函数

GREATEST(expr1, expr2[, expr3, ...])

功能说明:获得输入的所有参数中的最大值。该函数最小参数个数为 2 个。

2.2 LEAST 函数

LEAST(expr1, expr2[, expr3, ...])

功能说明:获得输入的所有参数中的最小值,其余部分同 GREATEST 函数。

3. 支持的数据类型

  • 数值类型:包括 bool 型、整型和浮点型
  • 字符串类型:支持 nchar 和 varchar 类型
  • 时间戳类型:TIMESTAMP 类型作为数值类型处理

注意:不支持上述之外的其他类型。

4. 返回结果类型

返回结果类型参考比较规则,比较类型即为最终返回类型。

5. 比较规则

5.1 基本规则

  1. NULL 处理:如果有任何一个参数为 NULL,则比较结果为 NULL
  2. 字符串比较:如果比较操作中的所有参数都是字符串类型,按照字符串类型比较
  3. 数值比较:如果所有参数都是数值类型,则将它们作为数值类型进行比较
  4. 时间戳比较:TIMESTAMP 类型也是数值类型,当和 TIMESTAMP 参与比较的类型都是整数类型时,按照 TIMESTAMP 进行比较

5.2 混合类型比较

如果参数中既有字符串类型,也有数值类型,根据 compareAsStrInGreatest 配置项,统一作为字符串或者数值进行比较。默认按照字符串比较。

5.3 类型提升规则

在所有情况下,不同类型比较,比较类型会选择范围更大的类型进行比较。例如作为整数类型比较时,如果存在 BIGINT 类型,必定会选择 BIGINT 作为比较类型。

6. 相关配置项

客户端配置compareAsStrInGreatest

  • 值为 1:同时存在字符串类型和数值类型统一转为字符串比较
  • 值为 0:统一转为数值类型比较
  • 默认值:1

7. 使用示例

7.1 基本数值比较

-- 计算三相电流最大值
SELECT ts,GREATEST(current_a, current_b, current_c) AS max_current
FROM power_meter;-- 计算三相电压最小值
SELECT ts,LEAST(voltage_a, voltage_b, voltage_c) AS min_voltage
FROM power_meter;

7.2 多字段比较

-- 计算多个传感器温度的最大值
SELECT ts,GREATEST(temp_sensor1, temp_sensor2, temp_sensor3, temp_sensor4) AS max_temperature
FROM sensor_data;-- 计算多个传感器湿度的最小值
SELECT ts,LEAST(humidity_sensor1, humidity_sensor2, humidity_sensor3) AS min_humidity
FROM sensor_data;

7.3 字符串比较

-- 字符串最大值比较
SELECT GREATEST('apple', 'banana', 'cherry') AS max_fruit;
-- 结果:'cherry'-- 字符串最小值比较
SELECT LEAST('apple', 'banana', 'cherry') AS min_fruit;
-- 结果:'apple'

7.4 混合类型比较

-- 混合类型比较(默认按字符串比较)
SELECT GREATEST(10, '20', 5) AS result;
-- 结果:'20'(字符串比较)-- 如果配置 compareAsStrInGreatest = 0
SELECT GREATEST(10, '20', 5) AS result;
-- 结果:20(数值比较)

7.5 NULL 值处理

-- 包含 NULL 的比较
SELECT GREATEST(10, NULL, 20) AS result;
-- 结果:NULLSELECT LEAST(10, NULL, 20) AS result;
-- 结果:NULL

7.6 实际应用场景

-- 电力监控:计算三相功率最大值
SELECT ts,device_id,GREATEST(power_a, power_b, power_c) AS max_phase_power,LEAST(power_a, power_b, power_c) AS min_phase_power,(power_a + power_b + power_c) AS total_power
FROM power_consumption
WHERE ts >= '2023-01-01 00:00:00'
ORDER BY ts;-- 环境监控:计算多点温度极值
SELECT ts,location,GREATEST(temp_indoor, temp_outdoor, temp_equipment) AS max_temp,LEAST(temp_indoor, temp_outdoor, temp_equipment) AS min_temp,ABS(GREATEST(temp_indoor, temp_outdoor, temp_equipment) - LEAST(temp_indoor, temp_outdoor, temp_equipment)) AS temp_range
FROM environmental_data
WHERE ts >= NOW() - INTERVAL 1 DAY;

8. 性能优势

使用 GREATESTLEAST 函数相比传统的 CASE WHEN 语句具有以下优势:

  1. 代码简洁:大幅减少代码量,提高可读性
  2. 性能提升:内置函数执行效率更高
  3. 维护性好:逻辑清晰,易于理解和维护
  4. 错误率低:减少因复杂逻辑导致的错误

9. 注意事项

  1. 最小参数个数:函数至少需要 2 个参数
  2. 数据类型限制:仅支持数值类型、字符串类型(nchar/varchar)
  3. NULL 处理:任何参数为 NULL 时,结果为 NULL
  4. 混合类型:注意 compareAsStrInGreatest 配置项的影响
  5. 类型提升:系统会自动选择范围更大的类型进行比较

10. 支持版本

TDengine 3.3.6.0 及以上版本。

11. 常见问题

Q1: 如何处理不同数据类型的比较?

A1: 系统会根据 compareAsStrInGreatest 配置项决定比较方式。默认情况下,混合类型会统一按字符串比较。

Q2: 函数是否支持时间戳类型?

A2: 支持。TIMESTAMP 类型作为数值类型处理,当与整数类型比较时按照 TIMESTAMP 进行比较。

Q3: 如何在聚合查询中使用这些函数?

A3: 可以在 SELECT、WHERE、HAVING 等子句中正常使用,与其他函数组合使用。

Q4: 函数的参数个数有限制吗?

A4: 最少需要 2 个参数,最多参数个数由系统限制决定。

通过使用 GREATESTLEAST 函数,您可以更高效地处理多字段比较需求,特别是在工业物联网、电力监控等需要频繁进行多维度数据比较的场景中。

关于 TDengine

TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914544.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 与数据库不一致问题及解决方案

一、不一致的原因分析 1. 缓存更新策略不当 先更新数据库后删除缓存:删除缓存失败会导致不一致 先删除缓存后更新数据库:并发请求可能导致不一致 缓存穿透:大量请求直接打到数据库,绕过缓存 2. 并发操作问题 读写并发:读请求获取旧缓存时,写请求更新了数据库但未更新缓存…

iOS 加固工具使用经验与 App 安全交付流程的实战分享

在实际开发中&#xff0c;iOS App不仅要安全&#xff0c;还要能被稳定、快速、无误地交付。这在外包、B端项目、渠道分发、企业自用系统等场景中尤为常见。 然而&#xff0c;许多开发者在引入加固工具后会遇到以下困扰&#xff1a; 混淆后App运行异常、不稳定&#xff1b;资源路…

Windows 下 Visual Studio 开发 C++ 项目的部署流程

在Windows环境中使用Visual Studio&#xff08;以下简称VS&#xff09;开发C项目时&#xff0c;“部署”是确保程序能在目标设备上正常运行的关键环节。部署的核心目标是&#xff1a;将编译生成的可执行文件&#xff08;.exe&#xff09;、依赖的动态链接库&#xff08;.dll&am…

yolo8+声纹识别(实时字幕)

现在已经完成了人脸识别跟踪 ✅&#xff0c;接下来要&#xff1a; ✅ 加入「声纹识别&#xff08;说话人识别&#xff09;」功能&#xff0c;识别谁在讲话&#xff0c;并在视频中“这个人”的名字旁边加上「正在讲话」。 这属于多模态识别&#xff08;视觉 音频&#xff09;&a…

DH(Denavit–Hartenberg)矩阵

DH 矩阵&#xff08;Denavit-Hartenberg 矩阵&#xff09;是 1955 年由 Denavit 和 Hartenberg 提出的一种机器人运动学建模方法&#xff0c;用于描述机器人连杆和关节之间的关系。该方法通过在机器人每个连杆上建立坐标系&#xff0c;并用 44 的齐次变换矩阵&#xff08;DH 矩…

Vim的magic模式

在 Vim 中&#xff0c;magic 模式用于控制正则表达式中特殊字符的解析方式。它决定了哪些字符需要转义才能发挥特殊作用&#xff0c;从而影响搜索和替换命令的写法。以下是详细介绍&#xff1a; 一、三种 magic 模式 Vim 提供三种 magic 模式&#xff0c;通过在正则表达式前添加…

Git 使用技巧与原理(一)—— 基础操作

1、起步 1.1 版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 版本控制系统&#xff08;VCS&#xff0c;Version Control System&#xff09;通常可以分为三类&#xff1a; 本地版本控制系统&#xff1a;大多都是采用某…

软件测试之自动化测试

目录 1.什么是自动化测试 2.web⾃动化测试 2.1驱动 WebDriverManager 3. Selenium 3.1selenium驱动浏览器的⼯作原理 4.常用函数 4.1元素的定位 4.1.1cssSelector选择器 4.2.2xpath 4.2操作测试对象 4.3窗⼝ 4.4等待 4.5浏览器导航 4.6弹窗 4.7文件上传 4.8设置…

sqlserver迁移日志文件和数据文件

sqlserver安装后没有指定日志存储路径或者还原库指定的日志存储位置不理想想要更改&#xff0c;都可以按照这种方式来更换&#xff1b;1.前提准备&#xff1a;数据库的备份bak文件2.查看自己当前数据库的日志文件和数据文件存储路径是否理想选中当前数据库&#xff0c;右键属性…

MFC UI表格制作从专家到入门

文章目录CListCtrl常见问题增强版CGridCtrl&#xff08;第三方&#xff09;第三方库ReoGridCListCtrl 默认情况下&#xff0c;CListCtrl不支持直接编辑单元格&#xff0c;需通过消息处理实现。 1.添加控件到资源视图 在对话框资源编辑器中拖入List Control控件&#xff0c;设…

数字后端APR innovus sroute到底是如何选取宽度来铺power rail的?

吾爱IC社区新一期IC训练营将于7月初开班&#xff08;07.06号晚上第一次直播课&#xff09;&#xff01;社区所有IC后端训练营课程均为直播课&#xff01;全网唯一一家敢开后端直播课的&#xff08;口碑不好招生一定存在困难&#xff0c;自然就无法开直播课&#xff09;&#xf…

LVS集群技术

LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux内核的高性能、高可用性服务器集群技术&#xff0c;它通过负载均衡将客户端请求分发到多台后端真实服务器&#xff0c;实现 scalability 和 fault tolerance。LVS工作在传输层&#xff08;OSI Layer 4&#xff…

git项目,有idea文件夹,怎么去掉

要从Git项目中排除.idea文件夹&#xff08;IntelliJ IDEA的配置文件目录&#xff09;&#xff0c;可以通过以下步骤操作&#xff1a; 1. 添加.gitignore规则 在项目根目录创建或编辑.gitignore文件&#xff0c;添加以下内容&#xff1a; .idea/2. 从Git缓存中删除已跟踪的.idea…

springboot+swagger2文档从swagger-bootstrap-ui更换为knife4j及文档接口参数不显示问题

背景 已有springboot项目,且使用的是swagger2+swagger-bootstrap-ui的版本 1.pom依赖如下 <!-- Swagger接口管理工具 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9…

mysql数据库表只能查询,对于插入、更新、删除操作一直卡住,直到报错Lost connection to MySQL server during query

诊断步骤1. 查看阻塞进程SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;SELECT * FROM sys.schema_table_lock_waits;2. 查看当前活动事务SELECT * FROM information_schema.INNODB_TRX;3. 查看进程列表SHOW PROCESSLIST;通过SELECT * FROM in…

Redis BigKey 深度解析:从原理到实战解决方案

引言&#xff1a;什么是 BigKey&#xff1f;在 Redis 的使用场景中&#xff0c;BigKey&#xff08;大键&#xff09;是指那些数据量异常庞大的键值&#xff0c;通常表现为&#xff1a;String 类型&#xff1a;值大小超过 10KBHash/Set 等&#xff1a;元素数量超过 5000List/ZSe…

Qt 实现新手引导

Qt实现新手引导 对于一个新安装的软件或者一个新的功能&#xff0c;提供一个新手引导步骤&#xff0c;能够让用户快速熟悉。这是最终效果&#xff0c;每一个按钮都会有一个简单引导&#xff0c;通过点击上一步、下一步来切换不同的指导。当前引导的功能&#xff0c;会有一个高光…

Maven+Spring

一、Maven 相关- 本地仓库设置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以设置 Maven 的本地仓库路径&#xff0c;本地仓库用于存储从远程仓库下载的依赖库&#xff0c;方便项目重复使用。- 仓库关系&#xff1a;- 项目&#xff1a;开发中的项目&…

Android Handler 消息机制

常用场景&#xff1a; 子线程发送Message 主线程处理Message 子线程发送消息 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {Message msg Message.obtain();msg.what what;return sendMessageDelayed(msg, delayMillis);}public final boole…

day9 串口通信

1串口通信串口通信是嵌入式系统和电子设备中最常用的 异步串行通信 方式&#xff0c;核心是通过 TX&#xff08;发送&#xff09; 和 R&#xff08;接收&#xff09; 两根线实现全双工数据传输。2通信协议分类2.1同步/异步通信同步和异步是串行通信中两种根本不同的数据传输方式…