
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
注意事项
- NULL 值处理: 任何参数为 NULL 时,整体结果为 NULL
- 类型一致性: 建议比较相同类型的数据以获得预期结果
- 字符串排序: 字符串按字典序比较,可能与数值大小不同
- 性能考虑: 对大量数据使用时,建议在适当位置添加索引
- 参数数量: 最少 2 个参数,建议不超过 10 个参数以保证性能
- 预警系统: LEAST 常与 CASE WHEN 结合使用,根据最小值设置不同的预警级别
相关函数
- GREATEST: 返回所有参数中的最大值
- MIN: 聚合函数,返回列的最小值
- MAX: 聚合函数,返回列的最大值
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。