
GitHub Copilot
LOG 函数
语法
sql
LOG(expr)
LOG(expr, base)
功能说明
- LOG(x) 返回 x 的自然对数,等价于 LN(x)
- LOG(x, b) 返回以 b 为底的对数,等价于 LN(x) / LN(b)
版本
- v3.3.x
返回结果类型
- DOUBLE
适用数据类型
- 数值类型:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE 及其无符号类型
- 不支持:BOOL、BINARY、NCHAR、TIMESTAMP 作为参数
嵌套子查询支持
- 适用于内层查询和外层查询
适用于
- 表和超级表
使用说明
- 参数个数为 1 或 2;少于 1 或多于 2 个参数报错
- 定义域约束
- x 必须大于 0,否则返回 NULL
- base 必须大于 0 且不等于 1,否则返回 NULL
- NULL 传播:任一参数为 NULL 时结果为 NULL
- 与类型提升:按数值类型提升到浮点进行计算,结果为 DOUBLE
- 仅与普通列、选择(Selection)、投影(Projection)函数一起使用;不要与聚合(Aggregation)函数在同一层直接混用
错误与异常
- LOG(x) 当 x ≤ 0 → 返回 NULL
- LOG(x, 1) 或 LOG(x, b ≤ 0) → 返回 NULL
- 参数数量不合法、参数类型不合法 → 语法错误
- 同一 SELECT 中混用聚合列与非聚合表达式(例如 c1 与 COUNT(...))→ 语法错误
示例所用表与数据(可直接复制执行)
sql
-- 1) 建库与使用
CREATE DATABASE IF NOT EXISTS power;
USE power;
-- 2) 建超级表(示例字段覆盖整型/浮点等常见数值类型)
CREATE STABLE meters (
ts TIMESTAMP,
current FLOAT,
voltage INT,
temperature FLOAT,
power DOUBLE
) TAGS (
location VARCHAR(64),
gid INT
);
-- 3) 建子表
CREATE TABLE d1001 USING meters TAGS ('SF', 1);
CREATE TABLE d1002 USING meters TAGS ('LA', 2);
-- 4) 写入示例数据
INSERT INTO d1001 VALUES
('2024-01-01 10:00:00.000', 10.3, 220, 25.5, 2266.0),
('2024-01-01 10:01:00.000', 12.6, 220, 28.2, 2772.0),
('2024-01-01 10:02:00.000', 8.5, 221, 22.8, 1878.5);
INSERT INTO d1002 VALUES
('2024-01-01 10:00:00.000', 9.0, 219, 24.0, 1971.0),
('2024-01-01 10:01:00.000', 14.0, 222, 26.0, 3108.0),
('2024-01-01 10:02:00.000', 7.2, 220, 23.5, 1584.0);
说明
- 示例表与字段简洁直观,覆盖 LOG 的典型用法
- 可直接复制执行,便于复现本文各 SQL 示例
- 全文示例均不使用 WITH、窗口函数(如 LAG、OVER),符合 TDengine 语法特性
使用示例
1) 基础用法(单参数,自然对数)
sql
-- 自然对数(等同 LN)
SELECT ts, current, LOG(current) AS ln_current FROM d1001;
2) 指定底数(常用 10、2)
sql
-- 以 10 为底的对数
SELECT ts, power, LOG(power, 10) AS log10_power FROM d1001;
sql
-- 以 2 为底的对数(常用于量级、分桶)
SELECT ts, voltage, LOG(voltage, 2) AS log2_voltage FROM d1002;
3) 非法与 NULL 输入处理
sql
-- 小于等于 0 或底数等于 1 均为 NULL
SELECT
LOG(-1) AS ln_neg1,
LOG(0) AS ln_zero,
LOG(10, 1) AS log_base1,
LOG(10, -2) AS log_base_neg;
4) 与列计算组合
sql
-- 组合计算后再取对数
SELECT ts, current * voltage AS pv, LOG(current * voltage) AS ln_pv FROM d1001;
5) 作为过滤条件
sql
-- 过滤"对数功率"超过阈值的记录(指数尺度下的阈值更稳定)
SELECT ts, power
FROM d1002
WHERE LOG(power, 10) > 3;
6) 作为派生列参与进一步计算
sql
-- 用对数差近似相对变化(同一行内字段对比,不使用窗口函数)
SELECT
ts,
power,
temperature,
LOG(power) - LOG(temperature) AS ln_power_temp_diff
FROM d1001
WHERE power > 0 AND temperature > 0;
生产场景应用与目的
场景 A:功率/能耗的对数刻度分析(跨数量级可视化)
目的
- 把功率或能耗映射到对数尺度,便于跨数量级对比与可视化
示例
sql
SELECT ts, power, LOG(power, 10) AS log10_power
FROM d1001
ORDER BY ts;
场景 B:对数范围与波动评估(相对变化更稳定)
目的
- 通过 log(max) - log(min) 衡量区间相对波动,弱化绝对量纲影响
示例
sql
SELECT
MIN(voltage) AS min_v,
MAX(voltage) AS max_v,
LOG(MAX(voltage)) - LOG(MIN(voltage)) AS ln_range
FROM d1002;
场景 C:几何平均(乘性数据的中心趋势)
目的
- 相比算术平均,几何平均更适合倍率、比率等乘性数据
示例
sql
SELECT
EXP(AVG(LOG(current))) AS geo_mean_current
FROM d1001
WHERE current > 0;
场景 D:分贝计算(dB,对数度量)
目的
- 在信号/噪声分析中以 dB 统一度量,便于与标准阈值比较
示例
sql
-- dB = 10 * log10(P) = 10 * LOG(P, 10)
SELECT
ts,
power,
10 * LOG(power, 10) AS power_db
FROM d1002
WHERE power > 0
ORDER BY power_db DESC
LIMIT 5;
案例 E:量级分桶(阈值/告警分级)
目的
- 按数量级划分区间用于统计与告警分级
示例
sql
-- 将功率按 10 的对数量级分桶
SELECT
FLOOR(LOG(power, 10)) AS mag_bin,
COUNT(*) AS cnt
FROM d1001
WHERE power > 0
GROUP BY mag_bin
ORDER BY mag_bin;
注意事项
- 避免对非正数取对数;必要时先做清洗或使用 CASE 过滤
- 底数选择:常用 e、10、2;避免使用 1 或非正底数
- LOG 逐行计算,建议配合时间过滤、列裁剪等减少扫描
- 不使用 WITH、窗口函数(如 LAG、OVER);示例均符合 TDengine 语法
- 与聚合混用请遵循 SQL 规范;不要同时选择非聚合列与聚合列而不分组
相关函数
- LN(x):自然对数,等价于 LOG(x)
- EXP(x):指数函数,LN 与 EXP 互为反函数
- 其他数学函数:ABS、CEIL、FLOOR 等可与 LOG 组合完成特征变换
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。