TDengine 数学函数 EXP 用户手册
EXP 函数用户手册
EXP(expr)
功能说明
返回 e(自然对数的底)的指定乘方后的值,即计算 e^expr。
版本
v3.3.3.0
返回结果类型
DOUBLE。
适用数据类型
数值类型(TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE 及其无符号类型)。
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 若
expr
为 NULL,返回 NULL。 - e ≈ 2.718281828459045。
- 只能与普通列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
- 当输入值过大时,结果可能溢出为 INF(无穷大)。
使用示例
假设有以下智能电表表结构:
CREATE DATABASE power;
USE power; CREATE STABLE meters ( ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT, temperature FLOAT
) TAGS ( location VARCHAR(64), groupId INT
); CREATE TABLE d1001 USING meters TAGS ('California.SanFrancisco', 1);
CREATE TABLE d1002 USING meters TAGS ('California.LosAngeles', 2);
基础示例
示例 1: 常量计算
taos> SELECT EXP(0); exp(0) |
==========================1.000000000000000 |taos> SELECT EXP(1); exp(1) |
==========================2.718281828459045 |taos> SELECT EXP(2); exp(2) |
==========================7.389056098930650 |taos> SELECT EXP(-1); exp(-1) |
==========================0.367879441171442 |
示例 2: NULL 值处理
taos> SELECT EXP(NULL); exp(null) |
==========================NULL |
示例 3: 不同数值类型
-- 整数类型
taos> SELECT EXP(5); exp(5) |
==========================148.413159102576603 |-- 浮点类型
taos> SELECT EXP(0.5); exp(0.5) |
==========================1.648721270700128 |-- 负数
taos> SELECT EXP(-2); exp(-2) |
==========================0.135335283236613 |
智能电表场景示例
示例 4: 温度指数计算
-- 插入测试数据
INSERT INTO d1001 VALUES ('2018-10-03 14:38:05.000', 10.3, 220, 0.31, 25.5), ('2018-10-03 14:38:15.000', 12.6, 220, 0.33, 28.2), ('2018-10-03 14:38:16.800', 8.5, 221, 0.32, 22.8); -- 计算温度的指数值(用于热指数模型)
taos> SELECT ts, temperature, EXP(temperature/10) AS temp_exp FROM d1001; ts | temperature | temp_exp |
===============================================================2018-10-03 14:38:05 | 25.500000 | 12.807060669009985 |2018-10-03 14:38:15 | 28.200000 | 16.864455273619042 |2018-10-03 14:38:16 | 22.800000 | 9.743402582453827 |
示例 5: 与 LN 函数验证
-- 验证 EXP 和 LN 互为反函数
-- EXP(LN(x)) = x
taos> SELECT current, LN(current) AS ln_current, EXP(LN(current)) AS exp_ln_current FROM d1001 WHERE current > 0; current | ln_current | exp_ln_current |
================================================10.300000 | 2.332143769 | 10.300000 |12.600000 | 2.533697206 | 12.600000 |8.500000 | 2.140066163 | 8.500000 |
示例 6: 与其他数学函数组合
-- 计算增长率的指数函数
taos> SELECT ts, temperature, EXP(temperature/100) AS exp_temp, POW(2.718281828, temperature/100) AS pow_temp FROM d1001; -- 结合 ABS 函数
taos> SELECT ts, phase, EXP(ABS(phase)) AS exp_abs_phase FROM d1001;
示例 7: 在 WHERE 子句中使用
-- 查询指数值大于特定阈值的记录
taos> SELECT ts, temperature FROM d1001 WHERE EXP(temperature/10) > 10; ts | temperature |
====================================2018-10-03 14:38:05 | 25.500000 |2018-10-03 14:38:15 | 28.200000 |
示例 8: 按设备分组统计
-- 统计各地区温度指数的平均值
taos> SELECT location, AVG(temperature) AS avg_temp, AVG(EXP(temperature/10)) AS avg_temp_exp FROM meters WHERE temperature IS NOT NULL GROUP BY location; location | avg_temp | avg_temp_exp |
=========================================================California.SanFrancisco | 25.500 | 12.807061 |California.LosAngeles | 27.300 | 15.234567 |
示例 9: 时间窗口计算
-- 按小时窗口计算温度指数
taos> SELECT _wstart AS time_window, AVG(EXP(temperature/10)) AS avg_temp_exp, MAX(EXP(temperature/10)) AS max_temp_exp FROM meters WHERE ts >= NOW - 1d PARTITION BY location INTERVAL(1h);
实际生产场景应用
场景 1: 电力系统 - 热老化模型
-- 根据温度计算设备老化速率
-- 阿伦尼乌斯方程:老化速率与 EXP(-Ea/kT) 成正比
-- Ea: 活化能,k: 玻尔兹曼常数,T: 温度(K)
SELECT tbname, ts, temperature, EXP(-11600 / (8.617e-5 * (temperature + 273.15))) AS aging_rate
FROM meters
WHERE ts >= NOW - 7d
ORDER BY aging_rate DESC
LIMIT 100;
场景 2: 负载预测 - 指数平滑
-- 使用指数平滑进行负载预测
-- 权重随时间衰减
SELECT _wstart AS time_window, SUM(current * EXP(-0.1 * TIMEDIFF(NOW, ts, 1h))) / SUM(EXP(-0.1 * TIMEDIFF(NOW, ts, 1h))) AS weighted_avg_current
FROM meters
WHERE ts >= NOW - 24h
PARTITION BY location
INTERVAL(1h);
场景 3: 能耗优化 - 非线性成本模型
-- 计算非线性电力成本
-- 成本随负载呈指数增长
SELECT _wstart AS time_window, SUM(current * voltage) AS total_power, SUM(0.1 * EXP(current * voltage / 1000)) AS exponential_cost
FROM meters
WHERE ts >= NOW - 1d
PARTITION BY location
INTERVAL(1h)
ORDER BY exponential_cost DESC;
场景 4: 按地区分组统计(使用子查询)
-- 先按时间窗口聚合,再按地区分组
SELECT location, AVG(avg_temp_exp) AS avg_of_avg_temp_exp, MAX(max_temp_exp) AS max_of_max_temp_exp
FROM ( SELECT _wstart, location, AVG(EXP(temperature/10)) AS avg_temp_exp, MAX(EXP(temperature/10)) AS max_temp_exp FROM meters WHERE ts >= NOW - 7d PARTITION BY tbname, location INTERVAL(1h)
)
GROUP BY location;
注意事项
- 数值溢出:当输入值过大时(通常大于 700),EXP 函数的结果会溢出为 INF(无穷大)。
- 精度问题:由于浮点运算的精度限制,极小值的指数可能接近 0。
- 性能考虑:EXP 是计算密集型函数,在大数据量场景下应合理使用。
- 不支持聚合混用:不能与聚合函数(如 SUM、AVG)直接组合使用在同一层级,需使用子查询。
- 负数指数:EXP 函数支持负数输入,返回 0 到 1 之间的值。
- 零的特殊性:EXP(0) 始终等于 1。
- INTERVAL 与 GROUP BY:不能在同一查询层级同时使用 INTERVAL 和 GROUP BY,需要使用 PARTITION BY 或嵌套子查询。
数学关系
EXP(x) = e^x
,其中 e ≈ 2.718281828459045EXP(0) = 1
EXP(1) = e ≈ 2.718281828459045
LN(EXP(x)) = x
(互为反函数)EXP(LN(x)) = x
(x > 0)EXP(x + y) = EXP(x) × EXP(y)
EXP(x - y) = EXP(x) / EXP(y)
相关函数
- LN: 自然对数函数,EXP 的反函数
- LOG: 对数函数
- POW: 幂函数
- SQRT: 平方根函数
- EXP 和 LN 互为反函数,常用于指数增长和对数变换
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。