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 智能体对数据进行预测与异常检测,提供实时的商业洞察。

相关推荐
kejiayuan18 小时前
CTE更易懂的SQL风格
数据库·sql
kaico201818 小时前
MySQL的索引
数据库·mysql
黄焖鸡能干四碗19 小时前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
专业开发者19 小时前
借助安全返场方案提升智慧建筑能效的新机遇
物联网·安全
世岩清上19 小时前
乡村振兴主题展厅本土化材料运用与地域文化施工表达
大数据·人工智能·乡村振兴·展厅
清水白石00819 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
资生算法程序员_畅想家_剑魔19 小时前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
说私域19 小时前
短视频私域流量池的变现路径创新:基于AI智能名片链动2+1模式S2B2C商城小程序的实践研究
大数据·人工智能·小程序
PyHaVolask19 小时前
SQL注入漏洞原理
数据库·sql
MM_MS19 小时前
Halcon图像锐化和图像增强、窗口的相关算子
大数据·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测