TDengine 数据函数 LN 用户手册

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)) = xEXP(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。

实际应用价值
  1. 数据标准化

    对数变换可以将偏态分布转换为接近正态分布,便于统计分析和异常检测。

  2. 比例关系分析

    对数差分等于比值的对数:ln(a) - ln(b) = ln(a/b),常用于计算增长率和相对变化。

  3. 指数关系线性化

    将指数关系 y = ae^(bx) 转换为线性关系:ln(y) = ln(a) + bx,便于回归分析和趋势预测。

  4. 信号处理

    在信号处理中,分贝(dB)是基于对数的单位,用于表示功率比,使得大范围的信号强度可以用紧凑的数值表示。

  5. 金融分析

    对数收益率在金融分析中广泛使用,因为它们具有时间可加性,便于计算复合收益率。

  6. 物理定律

    许多物理定律涉及对数关系,如热力学中的熵、信息论中的信息量、放射性衰减等。

  7. 几何平均值计算

    通过对数变换计算几何平均值: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 智能体对数据进行预测与异常检测,提供实时的商业洞察。

相关推荐
机灵猫3 小时前
Redis 在订单系统中的实战应用:防重、限流与库存扣减
数据库·redis·缓存
木易2.03 小时前
从零构建RAG知识库管理系统(二)
数据库·oracle
程序新视界4 小时前
什么是MySQL JOIN查询的驱动表和被驱动表?
数据库·后端·mysql
lingggggaaaa4 小时前
小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇&数据库篇&MySQL&MSSQL&Oracle&自动化项目
java·数据库·windows·笔记·学习·安全·网络安全
小光学长4 小时前
基于Vue的保护动物信息管理系统r7zl6b88 (程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
一匹电信狗4 小时前
【MySQL】数据库的相关操作
linux·运维·服务器·数据库·mysql·ubuntu·小程序
兆龙电子单片机设计6 小时前
【STM32项目开源】STM32单片机智能农业大棚控制系统
stm32·单片机·物联网·开源·自动化
TDengine (老段)6 小时前
连接 TDengine 遇到报错 “failed to connect to server, reason: Connection refused” 怎么办?
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
攻城狮7号6 小时前
AI+大数据时代:如何从架构到生态重构时序数据库的价值?
大数据·人工智能·时序数据库·apache iotdb·sql大模型