TDengine 数据函数 LEAST 用户手册

LEAST 函数

语法

sql 复制代码
LEAST(expr1, expr2 [, expr] ...)

功能说明

获得输入的所有参数中的最小值。该函数最小参数个数为 2 个,最大参数个数不限。

版本:v3.3.6.0

返回结果类型

根据输入参数的类型确定,按照类型提升规则选择范围最大的类型作为返回类型。

适用数据类型

  • 数值类型:包括 bool 型、整型和浮点型
  • 字符串类型:包括 nchar 和 varchar 类型

嵌套子查询支持

适用于内层查询和外层查询。

适用于

表和超级表。

使用说明

1. NULL 值处理

如果有任何一个参数为 NULL,则比较结果为 NULL。

举例:

sql 复制代码
taos> SELECT LEAST(1, NULL, 3);
 least(1, null, 3) |
====================
 NULL               |

taos> SELECT LEAST(NULL, NULL);
 least(null, null) |
====================
 NULL               |

2. 字符串类型比较

如果所有参数都是字符串类型,按照字符串类型比较。

举例:

sql 复制代码
-- 纯字符串比较
taos> SELECT LEAST('abc', 'def', 'xyz');
 least('abc', 'def', 'xyz') |
=============================
 abc                         |

-- 中文字符串比较
taos> SELECT LEAST('张三', '李四', '王五');
 least('张三', '李四', '王五') |
================================
 张三                         |

3. 数值类型比较

如果所有参数都是数值类型,则将它们作为数值类型进行比较。

举例:

sql 复制代码
-- 整数比较
taos> SELECT LEAST(1, 5, 3);
 least(1, 5, 3) |
=================
              1 |

-- 浮点数比较
taos> SELECT LEAST(1.5, 2.3, 1.8);
 least(1.5, 2.3, 1.8) |
=======================
    1.500000000000000 |

-- 混合数值类型比较
taos> SELECT LEAST(10, 20.5, 15);
 least(10, 20.5, 15) |
======================
   10.000000000000000 |

4. 混合类型比较

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

配置项说明:

  • compareAsStrInLeast = 1 (默认): 统一转为字符串比较
  • compareAsStrInLeast = 0: 统一转为数值类型比较

举例 1: 按字符串比较 (默认配置):

sql 复制代码
taos> SELECT LEAST('100', 20, '5');
 least('100', 20, '5') |
========================
 100                    |

-- 说明: 字符串比较时,'100' < '20' < '5'

举例 2: 按数值比较 (配置 compareAsStrInLeast=0):

sql 复制代码
taos> SELECT LEAST('100', 20, '5');
 least('100', 20, '5') |
========================
    5.000000000000000 |

-- 说明: 数值比较时,5 < 20 < 100

5. 类型自动提升

在所有情况下,不同类型比较时,比较类型会选择范围更大的类型进行比较。

举例:

sql 复制代码
-- TINYINT 和 BIGINT 比较,自动提升为 BIGINT
taos> SELECT LEAST(CAST(10 AS TINYINT), CAST(9223372036854775807 AS BIGINT));
 least(cast(10 as tinyint), cast(9223372036854775807 as bigint)) |
===================================================================
                                                               10 |

-- FLOAT 和 DOUBLE 比较,自动提升为 DOUBLE
taos> SELECT LEAST(CAST(1.5 AS FLOAT), CAST(1.6 AS DOUBLE));
 least(cast(1.5 as float), cast(1.6 as double)) |
=================================================
                                1.500000000000000 |

应用场景

LEAST 函数常用于在同一行数据中比较多个列的值,找出其中的最小值。以下是典型应用场景:

场景 1: 温度监控

比较同一时刻不同位置的温度读数,找出最低温度。

sql 复制代码
CREATE TABLE temperature_sensors (
    ts TIMESTAMP,
    room1_temp FLOAT,
    room2_temp FLOAT,
    room3_temp FLOAT,
    outdoor_temp FLOAT
);

INSERT INTO temperature_sensors VALUES
    ('2024-01-01 10:00:00', 23.5, 24.8, 22.1, 18.5),
    ('2024-01-01 10:01:00', 25.2, 23.9, 26.3, 19.2),
    ('2024-01-01 10:02:00', 24.1, 25.5, 24.7, 17.8);

-- 找出每个时刻的最低温度
taos> SELECT ts,
             room1_temp,
             room2_temp,
             room3_temp,
             outdoor_temp,
             LEAST(room1_temp, room2_temp, room3_temp, outdoor_temp) AS min_temp
      FROM temperature_sensors;
           ts            | room1_temp | room2_temp | room3_temp | outdoor_temp |      min_temp        |
================================================================================================
 2024-01-01 10:00:00.000 |     23.500 |     24.800 |     22.100 |       18.500 |   18.500000000000000 |
 2024-01-01 10:01:00.000 |     25.200 |     23.900 |     26.300 |       19.200 |   19.200000000000000 |
 2024-01-01 10:02:00.000 |     24.100 |     25.500 |     24.700 |       17.800 |   17.800000000000000 |

场景 2: 价格比较

比较同一商品在不同供应商的报价,找出最低价。

sql 复制代码
CREATE TABLE product_prices (
    ts timestamp,
    product_id INT,
    product_name VARCHAR(50),
    supplier_a FLOAT,
    supplier_b FLOAT,
    supplier_c FLOAT
);

INSERT INTO product_prices VALUES
    (now, 1, '商品A', 100.00, 95.50, 98.00),
    (now + 1s,2, '商品B', 200.00, 205.00, 195.00),
    (now + 2s,3, '商品C', 50.00, 52.00, 48.50);

-- 找出每个商品的最低价格
taos> SELECT product_name,
             supplier_a,
             supplier_b,
             supplier_c,
             LEAST(supplier_a, supplier_b, supplier_c) AS lowest_price
      FROM product_prices;
  product_name  | supplier_a | supplier_b | supplier_c |    lowest_price      |
===============================================================================
 商品A          |    100.000 |     95.500 |     98.000 |    95.500000000000000|
 商品B          |    200.000 |    205.000 |    195.000 |   195.000000000000000|
 商品C          |     50.000 |     52.000 |     48.500 |    48.500000000000000|

场景 3: 资源使用率监控

监控系统资源使用率,找出最低使用率(可能表示空闲资源)。

sql 复制代码
CREATE TABLE resource_usage (
    ts TIMESTAMP,
    cpu_usage FLOAT,
    memory_usage FLOAT,
    disk_usage FLOAT,
    network_usage FLOAT
);

INSERT INTO resource_usage 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,
             cpu_usage,
             memory_usage,
             disk_usage,
             network_usage,
             LEAST(cpu_usage, memory_usage, disk_usage, network_usage) AS min_usage,
             CASE
                 WHEN LEAST(cpu_usage, memory_usage, disk_usage, network_usage) = cpu_usage THEN 'CPU'
                 WHEN LEAST(cpu_usage, memory_usage, disk_usage, network_usage) = memory_usage THEN 'Memory'
                 WHEN LEAST(cpu_usage, memory_usage, disk_usage, network_usage) = disk_usage THEN 'Disk'
                 ELSE 'Network'
             END AS idle_resource
      FROM resource_usage;
           ts            | cpu_usage | memory_usage | disk_usage | network_usage |      min_usage       | idle_resource |
==========================================================================================================================
 2024-01-01 10:00:00.000 |    65.500 |       70.200 |     45.800 |        55.300 |   45.800000000000000 | Disk          |
 2024-01-01 10:01:00.000 |    80.100 |       75.500 |     90.200 |        60.800 |   60.800000000000000 | Network       |
 2024-01-01 10:02:00.000 |    55.800 |       85.300 |     50.100 |        95.700 |   50.100000000000000 | Disk          |

场景 4: 电池电量监控

监控多个电池模块的电量,找出最低电量用于预警。

sql 复制代码
CREATE TABLE battery_status (
    device_id VARCHAR(20),
    ts TIMESTAMP,
    battery1 FLOAT,
    battery2 FLOAT,
    battery3 FLOAT,
    battery4 FLOAT
);

INSERT INTO battery_status VALUES
    ('device001', '2024-01-01 10:00:00', 95.5, 92.3, 88.7, 90.1),
    ('device002', '2024-01-01 10:00:00', 85.2, 78.9, 82.3, 80.5),
    ('device003', '2024-01-01 10:00:00', 25.8, 30.2, 28.5, 15.3);

-- 找出每个设备的最低电池电量
taos> SELECT device_id,
             ts,
             LEAST(battery1, battery2, battery3, battery4) AS min_battery_level,
             CASE
                 WHEN LEAST(battery1, battery2, battery3, battery4) < 20 THEN '严重预警'
                 WHEN LEAST(battery1, battery2, battery3, battery4) < 50 THEN '低电量预警'
                 ELSE '电量正常'
             END AS alert_level
      FROM battery_status;
  device_id  |           ts            |  min_battery_level   |  alert_level  |
=================================================================================
 device001   | 2024-01-01 10:00:00.000 |   88.700000000000000 | 电量正常      |
 device002   | 2024-01-01 10:00:00.000 |   78.900000000000000 | 电量正常      |
 device003   | 2024-01-01 10:00:00.000 |   15.300000000000000 | 严重预警      |

场景 7: 响应时间监控

监控不同服务端点的响应时间,找出最快的响应路径。

sql 复制代码
CREATE TABLE service_response (
    ts TIMESTAMP,
    endpoint_a FLOAT,
    endpoint_b FLOAT,
    endpoint_c FLOAT
);

INSERT INTO service_response VALUES
    ('2024-01-01 10:00:00', 125.5, 98.3, 110.7),
    ('2024-01-01 10:01:00', 150.2, 142.9, 135.8),
    ('2024-01-01 10:02:00', 88.6, 95.2, 92.1);

-- 找出每个时刻最快的响应时间
taos> SELECT ts,
             endpoint_a,
             endpoint_b,
             endpoint_c,
             LEAST(endpoint_a, endpoint_b, endpoint_c) AS fastest_response_ms
      FROM service_response;
           ts            | endpoint_a | endpoint_b | endpoint_c | fastest_response_ms  |
=========================================================================================
 2024-01-01 10:00:00.000 |    125.500 |     98.300 |    110.700 |    98.300000000000000|
 2024-01-01 10:01:00.000 |    150.200 |    142.900 |    135.800 |   135.800000000000000|
 2024-01-01 10:02:00.000 |     88.600 |     95.200 |     92.100 |    88.600000000000000|

配置说明

客户端配置项 compareAsStrInLeast:

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

配置方法:

bash 复制代码
# 在 taos.cfg 配置文件中添加
compareAsStrInLeast 1

注意事项

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

相关函数

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

关于 TDengine

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

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

相关推荐
心态特好4 小时前
从缓存到分库分表:MySQL 高并发海量数据解决方案全解析
数据库·mysql·缓存
骇客野人4 小时前
【软考备考】 NoSQL数据库有哪些,键值型、文档型、列族型、图数据库的特点与适用场景
数据库·nosql
BD_Marathon4 小时前
【MySQL】管理
数据库·mysql
Elastic 中国社区官方博客4 小时前
AI Agent 评估:Elastic 如何测试代理框架
大数据·人工智能·elasticsearch·搜索引擎
zb52144 小时前
从0 到 1:开启 Chrome 插件开发的奇妙之旅
时序数据库
倔强的石头_4 小时前
金仓多模数据库平替 MongoDB:电子证照国产化的技术实操与价值突破
数据库
Go高并发架构_王工4 小时前
MySQL性能优化案例分析:从问题到解决方案
数据库·mysql·性能优化
JAVA学习通4 小时前
开源 | MeiGen-MultiTalk:基于单张照片实现多人互动演绎
大数据·音视频·视频
二十三之歌4 小时前
Redis 中文学习手册
数据库·redis·学习