TDengine 数学函数 SIGN 用户手册

SIGN 函数
语法
SIGN(expr)
功能说明
返回数值表达式的符号,用于判断数值的正负性。
版本
v3.3.3.0
返回结果类型
与输入字段的原始数据类型一致。
适用数据类型
数值类型。
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 如果
expr为负数,返回 -1。 - 如果
expr为正数,返回 1。 - 如果
expr为 0,返回 0。 - 如果
expr为 NULL,返回 NULL。 - 只能与普通列、TAG 列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
示例所用表与数据(可直接复制执行)
-- 建库与使用
CREATE DATABASE IF NOT EXISTS power;
USE power;-- 智能电表表结构(带相位信息)
CREATE STABLE meters (ts TIMESTAMP,current FLOAT,voltage INT,phase FLOAT,power DOUBLE
) TAGS (groupid INT,location VARCHAR(64)
);-- 子表
CREATE TABLE d1001 USING meters TAGS (1, 'California.SanFrancisco');
CREATE TABLE d1002 USING meters TAGS (2, 'California.LosAngeles');-- 写入数据(包含正负功率值,模拟发电和用电场景)
INSERT INTO d1001 VALUES('2024-01-01 10:00:00.000', 10.3, 220, 30.0, 2266.0),('2024-01-01 10:01:00.000', -5.2, 221, 45.0, -1149.2),('2024-01-01 10:02:00.000', 8.5, 223, 60.0, 1895.5),('2024-01-01 10:03:00.000', -3.8, 222, 120.0, -843.6),('2024-01-01 10:04:00.000', 0.0, 220, 0.0, 0.0);INSERT INTO d1002 VALUES('2024-01-01 10:00:00.000', 9.0, 219, 0.0, 1971.0),('2024-01-01 10:01:00.000', -7.5, 222, 90.0, -1665.0),('2024-01-01 10:02:00.000', 7.2, 220, 180.0, 1584.0),('2024-01-01 10:03:00.000', -4.2, 221, -30.0, -928.2),('2024-01-01 10:04:00.000', 0.0, 220, 0.0, 0.0);
基础示例
示例 1: 常量符号判断
-- 正数返回 1
taos> SELECT SIGN(10);sign(10) |
========================1 |-- 负数返回 -1
taos> SELECT SIGN(-5);sign(-5) |
========================-1 |-- 零返回 0
taos> SELECT SIGN(0);sign(0) |
========================0 |-- 浮点数
taos> SELECT SIGN(-3.14);sign(-3.14) |
========================-1 |
示例 2: NULL 值处理
taos> SELECT SIGN(NULL);sign(null) |
========================NULL |
示例 3: 列数据符号判断
-- 判断电流方向(正:用电,负:发电)
SELECT ts, current, SIGN(current) AS current_direction
FROM d1001
ORDER BY ts;
ts | current | current_direction |
====================================================================2024-01-01 10:00:00.000 | 10.300000 | 1 |2024-01-01 10:01:00.000 | -5.200000 | -1 |2024-01-01 10:02:00.000 | 8.500000 | 1 |2024-01-01 10:03:00.000 | -3.800000 | -1 |2024-01-01 10:04:00.000 | 0.000000 | 0 |
示例 4: 功率方向标识
-- 标识功率流向(1:消耗,-1:输出,0:无功率)
SELECT ts,power,SIGN(power) AS power_direction,CASE WHEN SIGN(power) = 1 THEN '用电'WHEN SIGN(power) = -1 THEN '发电'ELSE '停机'END AS status
FROM d1002
ORDER BY ts;
智能电表场景示例
示例 5: 能流方向统计
目的:统计电表在用电和发电状态下的数据条数,评估双向电能计量情况。
SELECT location,SUM(CASE WHEN SIGN(power) = 1 THEN 1 ELSE 0 END) AS consuming_count,SUM(CASE WHEN SIGN(power) = -1 THEN 1 ELSE 0 END) AS generating_count,SUM(CASE WHEN SIGN(power) = 0 THEN 1 ELSE 0 END) AS idle_count
FROM meters
WHERE ts >= '2024-01-01 10:00:00'AND ts < '2024-01-01 10:05:00'
GROUP BY location;
应用价值:
- 评估分布式光伏发电的并网情况
- 监测双向电能表的工作状态
- 为电网调度提供数据支撑
示例 6: 电流方向切换检测(使用 DIFF 函数)
目的:检测电流方向变化事件,识别用电/发电状态切换。
-- 使用 DIFF 函数检测符号变化
SELECT ts,current,SIGN(current) AS current_direction,DIFF(SIGN(current)) AS direction_change_flag,CASE WHEN DIFF(SIGN(current)) != 0 THEN '方向切换'ELSE '方向不变'END AS status
FROM d1001
WHERE current != 0
ORDER BY ts;
应用价值:
- 识别逆变器频繁切换异常
- 监测光伏发电启停事件
- 预警电网波动影响
示例 7: 能量流向分类统计
目的:按时间窗口统计不同能量流向的平均功率,评估用电和发电的平衡性。
SELECT _wstart AS time_window,AVG(CASE WHEN SIGN(power) = 1 THEN power ELSE 0 END) AS avg_consume_power,AVG(CASE WHEN SIGN(power) = -1 THEN ABS(power) ELSE 0 END) AS avg_generate_power
FROM meters
WHERE ts >= '2024-01-01 10:00:00'AND ts < '2024-01-01 11:00:00'
INTERVAL(10m);
应用价值:
- 评估发电与用电的时序匹配度
- 优化储能系统充放电策略
- 指导微电网能量管理
示例 8: 异常零功率检测
目的:识别非正常的零功率状态(可能是传感器故障或设备离线)。
SELECT ts,voltage,current,power,SIGN(power) AS power_sign
FROM meters
WHERE SIGN(power) = 0AND voltage > 0AND ABS(current) > 0.1
ORDER BY ts;
应用价值:
- 检测功率计量异常
- 识别互感器故障
- 预防计量损失
示例 9: 逆功率保护监测
目的:监测逆功率(负功率)持续时间,触发逆功率保护告警。
SELECT ts,power,SIGN(power) AS power_direction
FROM meters
WHERE SIGN(power) = -1AND ABS(power) > 1000
ORDER BY ts;
应用价值:
- 防止逆功率损坏设备
- 满足电网反送电保护要求
- 保障用电安全
示例 10: 双向电能累计分离
目的:分别累计正向电能(用电)和反向电能(发电),用于分时计费。
SELECT _wstart AS billing_period,location,SUM(CASE WHEN SIGN(power) = 1 THEN power * 0.001 ELSE 0 END) AS forward_kwh,SUM(CASE WHEN SIGN(power) = -1 THEN ABS(power) * 0.001 ELSE 0 END) AS reverse_kwh
FROM meters
WHERE ts >= '2024-01-01 00:00:00'AND ts < '2024-01-02 00:00:00'
PARTITION BY location
INTERVAL(1d);
应用价值:
- 实现双向电能精确计费
- 支持光伏发电上网结算
- 满足分布式能源计量需求
示例 11: 电流功率符号一致性校验
目的:检查电流和功率符号是否一致,识别计量异常或配置错误。
SELECT ts,tbname,current,power,SIGN(current) AS current_sign,SIGN(power) AS power_sign,CASEWHEN SIGN(current) * SIGN(power) < 0 THEN '符号不一致'WHEN SIGN(current) = 0 OR SIGN(power) = 0 THEN '存在零值'ELSE '正常'END AS consistency_check
FROM meters
WHERE ABS(current) > 0.1AND ABS(power) > 10AND ts >= '2024-01-01 10:00:00'
ORDER BY ts;
应用价值:
- 检测互感器接线错误
- 识别计量配置问题
- 保证计量准确性
示例 12: 能量流向趋势分析
目的:分析一段时间内能量流向的变化趋势,评估自发自用率。
SELECT _wstart AS hour,COUNT(CASE WHEN SIGN(power) = 1 THEN 1 END) AS consume_samples,COUNT(CASE WHEN SIGN(power) = -1 THEN 1 END) AS generate_samples,COUNT(CASE WHEN SIGN(power) = -1 THEN 1 END) * 100.0 / (COUNT(CASE WHEN SIGN(power) = 1 THEN 1 END) + COUNT(CASE WHEN SIGN(power) = -1 THEN 1 END)) AS generation_ratio
FROM meters
WHERE ts >= '2024-01-01 00:00:00'AND ts < '2024-01-02 00:00:00'
INTERVAL(1h);
应用价值:
- 评估光伏发电利用率
- 优化储能系统配置
- 指导用能策略调整
生产场景应用与目的
场景 A: 双向电能计量与分时计费
目的:在分布式光伏、储能等双向电能场景下,需要区分用电(正向)和发电(反向)进行分别计量和计费。
示例:
-- 生成双向电能日报表
SELECT location,SUM(CASE WHEN SIGN(power) = 1 THEN power ELSE 0 END) * 0.001 AS consume_kwh,SUM(CASE WHEN SIGN(power) = -1 THEN ABS(power) ELSE 0 END) * 0.001 AS generate_kwh,SUM(CASE WHEN SIGN(power) = 1 THEN power ELSE 0 END) * 0.001 * 0.588 AS consume_fee,SUM(CASE WHEN SIGN(power) = -1 THEN ABS(power) ELSE 0 END) * 0.001 * 0.45 AS generate_income
FROM meters
WHERE ts >= CURRENT_DATEAND ts < CURRENT_DATE + 1d
GROUP BY location;
场景 B: 逆功率保护与安全监测
目的:监测设备是否出现逆功率情况,及时触发保护机制,防止设备损坏或电网事故。
示例:
-- 检测逆功率超标事件
SELECT ts,tbname AS meter_id,power,ABS(power) AS reverse_power
FROM meters
WHERE SIGN(power) = -1AND ABS(power) > 2000AND ts >= NOW - 1h
ORDER BY ts DESC;
场景 C: 光伏发电并网监测
目的:监测光伏逆变器的发电状态,统计发电时段和发电量,评估系统运行效率。
示例:
-- 统计各电表的发电时长和发电量
SELECT location,COUNT(CASE WHEN SIGN(power) = -1 THEN 1 END) * 5 / 60.0 AS generate_hours,SUM(CASE WHEN SIGN(power) = -1 THEN ABS(power) ELSE 0 END) * 0.001 AS total_generate_kwh,AVG(CASE WHEN SIGN(power) = -1 THEN ABS(power) ELSE NULL END) AS avg_generate_power
FROM meters
WHERE ts >= CURRENT_DATEAND ts < CURRENT_DATE + 1d
GROUP BY location;
场景 D: 设备工况状态识别
目的:通过功率符号快速识别设备的运行状态(用电、发电、停机),简化状态机逻辑。
示例:
-- 生成设备状态变化记录
SELECT ts,tbname,CASEWHEN SIGN(power) = 1 THEN '用电中'WHEN SIGN(power) = -1 THEN '发电中'ELSE '停机'END AS device_status,power
FROM meters
WHERE ts >= NOW - 1h
ORDER BY tbname, ts;
场景 E: 计量异常检测
目的:检测电流和功率符号不一致、零功率异常等计量问题,及时发现互感器接线错误或传感器故障。
示例:
-- 检测符号异常的数据
SELECT ts,tbname,current,power,SIGN(current) AS current_sign,SIGN(power) AS power_sign
FROM meters
WHERE SIGN(current) * SIGN(power) < 0AND ABS(current) > 0.1AND ABS(power) > 10AND ts >= NOW - 1d
ORDER BY ts DESC;
注意事项
-
数据类型一致性:SIGN 函数返回值类型与输入类型一致,整数输入返回整数,浮点输入返回浮点。
-
零值判断:对于浮点数,由于精度问题,建议使用
ABS(value) < threshold判断是否接近零,而不是直接使用SIGN(value) = 0。 -
NULL 传播:输入为 NULL 时返回 NULL,在条件过滤中需注意 NULL 值的处理。
-
性能考虑:SIGN 是简单的标量函数,性能开销极小,可以放心在大数据集中使用。
-
与聚合函数配合:SIGN 不能直接与聚合函数混用,但可以嵌套在 CASE 表达式中实现分组统计。
-
符号稳定性:对于接近零的微小值,浮点运算可能导致符号不稳定,建议设置合理的阈值进行过滤。
数学关系
-
基本定义:
SIGN(x) = 1当 x > 0SIGN(x) = -1当 x < 0SIGN(x) = 0当 x = 0
-
与其他函数的关系:
x = SIGN(x) * ABS(x)SIGN(-x) = -SIGN(x)SIGN(x * y) = SIGN(x) * SIGN(y)
-
常用组合:
- 方向判断:
CASE WHEN SIGN(x) = 1 THEN 'positive' ELSE 'negative' END - 符号统一:
x * SIGN(y)(将 x 的符号调整为与 y 相同)
- 方向判断:
相关函数
- ABS:绝对值函数,
x = SIGN(x) * ABS(x) - CASE:条件表达式,常与 SIGN 配合进行分支处理
- DIFF:差分函数,可用于检测数值变化和符号切换
- GREATEST/LEAST:极值比较,可用于符号相关的边界判断
函数意义与实际应用价值
数学意义
SIGN 函数是数学中的符号函数(signum function),将实数域映射到 {-1, 0, 1} 三值集合,是判断数值正负的标准方法。在数值计算、信号处理等领域有广泛应用。
实际应用价值
-
双向计量
- 区分正向和反向电能
- 支持分布式能源并网计量
- 实现买电/卖电分离结算
-
状态识别
- 快速判断设备运行模式
- 简化状态机实现
- 降低业务逻辑复杂度
-
异常检测
- 识别逆功率异常
- 检测计量符号错误
- 预警设备故障
-
数据分类
- 按正负分组统计
- 实现条件聚合
- 支持分段分析
-
业务规则
- 实现逆功率保护
- 支持能量流向控制
- 满足电网接入要求
本用户手册提供了 SIGN 函数的完整使用说明,特别针对电力系统中的双向电能计量、逆功率监测、光伏并网等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。
