TDengine 数学函数 GREATEST 用户手册

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

注意事项

  1. NULL 值处理: 任何参数为 NULL 时,整体结果为 NULL
  2. 类型一致性: 建议比较相同类型的数据以获得预期结果
  3. 字符串排序: 字符串按字典序比较,可能与数值大小不同
  4. 性能考虑: 对大量数据使用时,建议在适当位置添加索引
  5. 参数数量: 最少 2 个参数,建议不超过 10 个参数以保证性能

相关函数

  • LEAST: 返回所有参数中的最小值
  • MAX: 聚合函数,返回列的最大值
  • MIN: 聚合函数,返回列的最小值

关于 TDengine

TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。

它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。

相关推荐
安当加密4 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生
爱喝白开水a4 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
想ai抽4 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
武子康4 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
longgyy4 小时前
5 分钟用火山引擎 DeepSeek 调用大模型生成小红书文案
java·数据库·火山引擎
字节数据平台5 小时前
火山引擎Data Agent再拓新场景,重磅推出用户研究Agent
大数据·人工智能·火山引擎
ytttr8735 小时前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#
小莞尔6 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机
盒马coding6 小时前
第18节-索引-Partial-Indexes
数据库·postgresql