
GREATEST 函数
语法
sql
GREATEST(expr1, expr2 [, expr] ...)
功能说明
获得输入的所有参数中的最大值。该函数最小参数个数为 2 个,最大参数个数不限。
版本:v3.3.6.0
返回结果类型
根据输入参数的类型确定,按照类型提升规则选择范围最大的类型作为返回类型。
适用数据类型
- 数值类型:包括 bool 型、整型和浮点型
- 字符串类型:包括 nchar 和 varchar 类型
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
1. NULL 值处理
如果有任何一个参数为 NULL,则比较结果为 NULL。
举例:
sql
taos> SELECT GREATEST(1, NULL, 3);
greatest(1, null, 3) |
=======================
NULL |
taos> SELECT GREATEST(NULL, NULL);
greatest(null, null) |
=======================
NULL |
2. 字符串类型比较
如果所有参数都是字符串类型,按照字符串类型比较。
举例:
sql
-- 纯字符串比较
taos> SELECT GREATEST('abc', 'def', 'xyz');
greatest('abc', 'def', 'xyz') |
================================
xyz |
-- 中文字符串比较
taos> SELECT GREATEST('张三', '李四', '王五');
greatest('张三', '李四', '王五') |
===================================
王五 |
3. 数值类型比较
如果所有参数都是数值类型,则将它们作为数值类型进行比较。
举例:
sql
-- 整数比较
taos> SELECT GREATEST(1, 5, 3);
greatest(1, 5, 3) |
====================
5 |
-- 浮点数比较
taos> SELECT GREATEST(1.5, 2.3, 1.8);
greatest(1.5, 2.3, 1.8) |
==========================
2.3 |
-- 混合数值类型比较
taos> SELECT GREATEST(10, 20.5, 15);
greatest(10, 20.5, 15) |
=========================
20.5 |
4. 混合类型比较
如果参数中既有字符串类型,也有数值类型,根据 compareAsStrInGreatest
配置项,统一作为字符串或者数值进行比较。
配置项说明:
compareAsStrInGreatest = 1
(默认): 统一转为字符串比较compareAsStrInGreatest = 0
: 统一转为数值类型比较
举例 1: 按字符串比较 (默认配置):
sql
taos> SELECT GREATEST('100', 20, '5');
greatest('100', 20, '5') |
===========================
5 |
-- 说明: 字符串比较时,'5' > '20' > '100'
举例 2: 按数值比较 (配置 compareAsStrInGreatest=0):
sql
taos> SELECT GREATEST('100', 20, '5');
greatest('100', 20, '5') |
===========================
100 |
-- 说明: 数值比较时,100 > 20 > 5
5. 类型自动提升
在所有情况下,不同类型比较时,比较类型会选择范围更大的类型进行比较。
举例:
sql
-- TINYINT 和 BIGINT 比较,自动提升为 BIGINT
taos> SELECT GREATEST(CAST(10 AS TINYINT), CAST(9223372036854775807 AS BIGINT));
greatest(cast(10 as tinyint), cast(9223372036854775807 as bigint)) |
======================================================================
9223372036854775807 |
-- FLOAT 和 DOUBLE 比较,自动提升为 DOUBLE
taos> SELECT GREATEST(CAST(1.5 AS FLOAT), CAST(1.6 AS DOUBLE));
greatest(cast(1.5 as float), cast(1.6 as double)) |
====================================================
1.600000000000000 |
应用场景
GREATEST 函数常用于在同一行数据中比较多个列的值,找出其中的最大值。以下是典型应用场景:
场景 1: 监控数据分析
比较同一时刻不同传感器的读数,找出最大值。
sql
CREATE TABLE sensor_data (
ts TIMESTAMP,
sensor1 FLOAT,
sensor2 FLOAT,
sensor3 FLOAT
);
INSERT INTO sensor_data VALUES
('2024-01-01 10:00:00', 23.5, 24.8, 22.1),
('2024-01-01 10:01:00', 25.2, 23.9, 26.3),
('2024-01-01 10:02:00', 24.1, 25.5, 24.7);
-- 找出每个时刻传感器的最高读数
taos> SELECT ts,
sensor1,
sensor2,
sensor3,
GREATEST(sensor1, sensor2, sensor3) AS max_reading
FROM sensor_data;
ts | sensor1 | sensor2 | sensor3 | max_reading |
=================================================================================
2024-01-01 10:00:00.000 | 23.500 | 24.800 | 22.100 | 24.800000000000000|
2024-01-01 10:01:00.000 | 25.200 | 23.900 | 26.300 | 26.300000000000000|
2024-01-01 10:02:00.000 | 24.100 | 25.500 | 24.700 | 25.500000000000000|
场景 2: 学生成绩统计
比较一行学生记录中多门课程成绩,找出最高分。
sql
CREATE TABLE student_scores (
student_id INT,
name VARCHAR(50),
math INT,
english INT,
physics INT
);
INSERT INTO student_scores VALUES
(1, '张三', 85, 90, 78),
(2, '李四', 92, 88, 95),
(3, '王五', 78, 85, 82);
-- 找出每个学生的最高分
taos> SELECT name,
math,
english,
physics,
GREATEST(math, english, physics) AS highest_score
FROM student_scores;
name | math | english | physics | highest_score |
=============================================================
张三 | 85 | 90 | 78 | 90 |
李四 | 92 | 88 | 95 | 95 |
王五 | 78 | 85 | 82 | 85 |
场景 3: 库存管理
比较同一商品在不同仓库的库存量,找出最大库存。
sql
CREATE TABLE inventory (
product_id INT,
product_name VARCHAR(50),
warehouse_a INT,
warehouse_b INT,
warehouse_c INT
);
INSERT INTO inventory VALUES
(1, '商品A', 100, 150, 80),
(2, '商品B', 200, 180, 220),
(3, '商品C', 50, 60, 45);
-- 找出每个商品的最大库存
taos> SELECT product_name,
warehouse_a,
warehouse_b,
warehouse_c,
GREATEST(warehouse_a, warehouse_b, warehouse_c) AS max_inventory
FROM inventory;
product_name | warehouse_a | warehouse_b | warehouse_c | max_inventory |
===============================================================================
商品A | 100 | 150 | 80 | 150 |
商品B | 200 | 180 | 220 | 220 |
商品C | 50 | 60 | 45 | 60 |
场景 4: 性能指标监控
比较同一时间点多个性能指标,找出峰值。
sql
CREATE TABLE performance_metrics (
ts TIMESTAMP,
cpu_usage FLOAT,
memory_usage FLOAT,
disk_io FLOAT,
network_io FLOAT
);
INSERT INTO performance_metrics VALUES
('2024-01-01 10:00:00', 65.5, 70.2, 45.8, 55.3),
('2024-01-01 10:01:00', 80.1, 75.5, 90.2, 60.8),
('2024-01-01 10:02:00', 55.8, 85.3, 50.1, 95.7);
-- 找出每个时刻的最高性能指标
taos> SELECT ts,
GREATEST(cpu_usage, memory_usage, disk_io, network_io) AS peak_metric
FROM performance_metrics;
ts | peak_metric |
=================================================
2024-01-01 10:00:00.000 | 70.200000000000000|
2024-01-01 10:01:00.000 | 90.200000000000000|
2024-01-01 10:02:00.000 | 95.700000000000000|
配置说明
客户端配置项 compareAsStrInGreatest
:
- 为 1 表示同时存在字符串类型和数值类型时统一转为字符串比较
- 为 0 表示统一转为数值类型比较
- 默认为 1
配置方法:
bash
# 在 /etc/taos/taos.cfg 配置文件中添加
compareAsStrInGreatest 1
注意事项
- NULL 值处理: 任何参数为 NULL 时,整体结果为 NULL
- 类型一致性: 建议比较相同类型的数据以获得预期结果
- 字符串排序: 字符串按字典序比较,可能与数值大小不同
- 性能考虑: 对大量数据使用时,建议在适当位置添加索引
- 参数数量: 最少 2 个参数,建议不超过 10 个参数以保证性能
相关函数
- LEAST: 返回所有参数中的最小值
- MAX: 聚合函数,返回列的最大值
- MIN: 聚合函数,返回列的最小值
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。