
LN 函数
sql
LN(expr)
功能说明
返回指定参数的自然对数(以 e 为底的对数)。
版本
v3.3.3.0
返回结果类型
DOUBLE。
适用数据类型
数值类型(TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE 及其无符号类型)。
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 若
expr
为 NULL,返回 NULL。 - 若
expr
小于等于 0,返回 NULL。 - 自然对数是以数学常数 e(约等于 2.718281828459045)为底的对数。
- 只能与普通列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
- LN 函数与 EXP 函数互为反函数:
LN(EXP(x)) = x
且EXP(LN(x)) = x
(x > 0)。
使用示例
假设有以下智能电表表结构:
sql
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: 常量计算
sql
taos> SELECT LN(1);
ln(1) |
==========================
0.000000000000000 |
taos> SELECT LN(2.718281828459045);
ln(2.718281828459045) |
==========================
1.000000000000000 |
taos> SELECT LN(10);
ln(10) |
==========================
2.302585092994046 |
taos> SELECT LN(100);
ln(100) |
==========================
4.605170185988092 |
示例 2: NULL 值和非法值处理
sql
taos> SELECT LN(NULL);
ln(null) |
==========================
NULL |
taos> SELECT LN(0);
ln(0) |
==========================
NULL |
taos> SELECT LN(-1);
ln(-1) |
==========================
NULL |
taos> SELECT LN(-10.5);
ln(-10.5) |
==========================
NULL |
示例 3: 不同数值类型
sql
-- 整数类型
taos> SELECT LN(5);
ln(5) |
==========================
1.609437912434100 |
-- 浮点类型
taos> SELECT LN(2.5);
ln(2.5) |
==========================
0.916290731874155 |
-- 大数值
taos> SELECT LN(1000000);
ln(1000000) |
==========================
13.815510557964274 |
智能电表场景示例
示例 4: 电流对数变换
sql
-- 插入测试数据
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, current, LN(current) AS ln_current
FROM d1001;
ts | current | ln_current |
============================================================
2018-10-03 14:38:05 | 10.300000 | 2.332143769006468 |
2018-10-03 14:38:15 | 12.600000 | 2.533697208557746 |
2018-10-03 14:38:16 | 8.500000 | 2.140066163725569 |
示例 5: 对数刻度数据分析
sql
-- 使用对数刻度分析电压变化范围
-- 目的:在对数坐标系中观察电压波动,更容易发现电压的相对变化趋势
taos> SELECT location,
MIN(voltage) AS min_voltage,
MAX(voltage) AS max_voltage,
LN(MAX(voltage)) - LN(MIN(voltage)) AS log_range
FROM meters
WHERE ts >= NOW - 1d
GROUP BY location;
location | min_voltage | max_voltage | log_range |
===================================================================================
California.SanFrancisco | 218 | 221 | 0.013667275778099 |
California.LosAngeles | 219 | 222 | 0.013588896269716 |
示例 6: 功率增长率对数计算
sql
-- 计算功率的对数增长率(用于指数增长分析)
-- 目的:识别功率是否呈现指数增长趋势,便于预测未来负载
taos> SELECT ts,
current * voltage AS power,
LN(current * voltage) AS ln_power
FROM d1001;
ts | power | ln_power |
=================================================================
2018-10-03 14:38:05 | 2266.000000 | 7.725719184878962 |
2018-10-03 14:38:15 | 2772.000000 | 7.927223037483046 |
2018-10-03 14:38:16 | 1878.500000 | 7.538223506116255 |
示例 7: 与 EXP 函数验证
sql
-- 验证 LN 和 EXP 互为反函数
-- LN(EXP(x)) = x
taos> SELECT current,
EXP(LN(current)) AS exp_ln_current
FROM d1001
WHERE current > 0;
current | exp_ln_current |
================================
10.300000 | 10.300000 |
12.600000 | 12.600000 |
8.500000 | 8.500000 |
-- EXP(LN(x)) = x
taos> SELECT temperature,
LN(EXP(temperature)) AS ln_exp_temp
FROM d1001;
temperature | ln_exp_temp |
===================================
25.500000 | 25.500000 |
28.200000 | 28.200000 |
22.800000 | 22.800000 |
示例 8: 对数回归分析
sql
-- 使用对数变换进行线性回归分析
-- 目的:通过对数变换将非线性关系转化为线性关系,便于建立预测模型
-- 分析电流与温度的对数关系
taos> SELECT ts,
LN(current) AS ln_current,
LN(temperature) AS ln_temp,
LN(current) - LN(temperature) AS ln_ratio
FROM d1001;
ts | ln_current | ln_temp | ln_ratio |
=====================================================================================
2018-10-03 14:38:05 | 2.332143769006 | 3.239162871469 | -0.907019102463 |
2018-10-03 14:38:15 | 2.533697208558 | 3.339322067858 | -0.805624859300 |
2018-10-03 14:38:16 | 2.140066163726 | 3.126761445971 | -0.986695282245 |
示例 9: 在 WHERE 子句中使用
sql
-- 查询对数电流大于 2 的记录
taos> SELECT ts, current
FROM d1001
WHERE LN(current) > 2;
ts | current |
====================================
2018-10-03 14:38:05 | 10.300000 |
2018-10-03 14:38:15 | 12.600000 |
2018-10-03 14:38:16 | 8.500000 |
示例 10: 按设备分组统计几何平均值
sql
-- 统计各地区电流对数的平均值,计算几何平均值
-- 目的:几何平均值比算术平均值更适合描述乘性数据的中心趋势
taos> SELECT location,
AVG(current) AS avg_current,
AVG(LN(current)) AS avg_ln_current,
EXP(AVG(LN(current))) AS geometric_mean
FROM meters
WHERE temperature IS NOT NULL
AND current > 0
GROUP BY location;
location | avg_current | avg_ln_current | geometric_mean |
====================================================================================
California.SanFrancisco | 10.466667 | 2.335302447096 | 10.333333 |
California.LosAngeles | 11.200000 | 2.415606492694 | 11.180340 |
实际生产场景应用
场景 1: 电力系统 - 信号强度分析(分贝计算)
sql
-- 计算信号强度的分贝值(dB)
-- 目的:用于评估电力信号质量,便于与行业标准对比
-- dB = 10 * LOG10(P) = 10 * LN(P) / LN(10)
SELECT
tbname,
ts,
current * voltage AS power,
10 * LN(current * voltage) / LN(10) AS power_db
FROM meters
WHERE ts >= NOW - 1h
ORDER BY power_db DESC
LIMIT 100;
场景 2: 负载增长趋势分析(指数增长检测)
sql
-- 使用对数变换分析负载增长趋势
-- 目的:检测负载是否呈指数增长,提前预警电网扩容需求
-- 对数变换可以将指数增长转换为线性关系,便于趋势预测
SELECT
_wstart AS time_window,
AVG(current * voltage) AS avg_power,
LN(AVG(current * voltage)) AS ln_avg_power
FROM meters
WHERE ts >= NOW - 30d
PARTITION BY location
INTERVAL(1d)
ORDER BY time_window;
函数意义与实际应用价值
数学意义
LN 函数是自然对数函数,以数学常数 e(约 2.71828)为底。自然对数在数学和科学计算中具有特殊地位,因为它的导数形式最简单:d(ln x)/dx = 1/x。
实际应用价值
-
数据标准化
对数变换可以将偏态分布转换为接近正态分布,便于统计分析和异常检测。
-
比例关系分析
对数差分等于比值的对数:ln(a) - ln(b) = ln(a/b),常用于计算增长率和相对变化。
-
指数关系线性化
将指数关系 y = ae^(bx) 转换为线性关系:ln(y) = ln(a) + bx,便于回归分析和趋势预测。
-
信号处理
在信号处理中,分贝(dB)是基于对数的单位,用于表示功率比,使得大范围的信号强度可以用紧凑的数值表示。
-
金融分析
对数收益率在金融分析中广泛使用,因为它们具有时间可加性,便于计算复合收益率。
-
物理定律
许多物理定律涉及对数关系,如热力学中的熵、信息论中的信息量、放射性衰减等。
-
几何平均值计算
通过对数变换计算几何平均值:exp(avg(ln(x))),比算术平均值更适合描述乘性数据。
注意事项
- 定义域限制:LN 函数只对正数有定义,输入值必须大于 0。
- NULL 处理:输入为 NULL 或非正数时返回 NULL。
- 精度问题:对于极小的正数,对数值可能非常负,需注意数值范围。
- 性能考虑:LN 是标量函数,在大数据量场景下应合理使用。
- 数据质量:使用前应确保数据为正数,否则会产生大量 NULL 值。
数学关系
LN(1) = 0
LN(e) = 1
(e ≈ 2.718281828459045)LN(x * y) = LN(x) + LN(y)
LN(x / y) = LN(x) - LN(y)
LN(x^n) = n * LN(x)
LN(EXP(x)) = x
(互为反函数)EXP(LN(x)) = x
(x > 0)
相关函数
- EXP:指数函数,LN 的反函数
- LOG:对数函数(可指定底数)
- POW:幂函数
- SQRT:平方根函数
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。