TDengine 数学函数 SIGN 用户手册

SIGN 函数

语法

sql 复制代码
SIGN(expr)

功能说明

返回数值表达式的符号,用于判断数值的正负性。

版本

v3.3.3.0

返回结果类型

与输入字段的原始数据类型一致。

适用数据类型

数值类型。

嵌套子查询支持

适用于内层查询和外层查询。

适用于

表和超级表。

使用说明

  • 如果 expr 为负数,返回 -1。
  • 如果 expr 为正数,返回 1。
  • 如果 expr 为 0,返回 0。
  • 如果 expr 为 NULL,返回 NULL。
  • 只能与普通列、TAG 列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。

示例所用表与数据(可直接复制执行)

sql 复制代码
-- 建库与使用
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: 常量符号判断

sql 复制代码
-- 正数返回 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 值处理

sql 复制代码
taos> SELECT SIGN(NULL);
      sign(null)       |
========================
 NULL                  |

示例 3: 列数据符号判断

sql 复制代码
-- 判断电流方向(正:用电,负:发电)
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: 功率方向标识

sql 复制代码
-- 标识功率流向(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: 能流方向统计

目的:统计电表在用电和发电状态下的数据条数,评估双向电能计量情况。

sql 复制代码
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 函数)

目的:检测电流方向变化事件,识别用电/发电状态切换。

sql 复制代码
-- 使用 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: 能量流向分类统计

目的:按时间窗口统计不同能量流向的平均功率,评估用电和发电的平衡性。

sql 复制代码
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: 异常零功率检测

目的:识别非正常的零功率状态(可能是传感器故障或设备离线)。

sql 复制代码
SELECT ts,
       voltage,
       current,
       power,
       SIGN(power) AS power_sign
FROM meters
WHERE SIGN(power) = 0
  AND voltage > 0
  AND ABS(current) > 0.1
ORDER BY ts;

应用价值

  • 检测功率计量异常
  • 识别互感器故障
  • 预防计量损失

示例 9: 逆功率保护监测

目的:监测逆功率(负功率)持续时间,触发逆功率保护告警。

sql 复制代码
SELECT ts,
       power,
       SIGN(power) AS power_direction
FROM meters
WHERE SIGN(power) = -1
  AND ABS(power) > 1000
ORDER BY ts;

应用价值

  • 防止逆功率损坏设备
  • 满足电网反送电保护要求
  • 保障用电安全

示例 10: 双向电能累计分离

目的:分别累计正向电能(用电)和反向电能(发电),用于分时计费。

sql 复制代码
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: 电流功率符号一致性校验

目的:检查电流和功率符号是否一致,识别计量异常或配置错误。

sql 复制代码
SELECT ts,
       tbname,
       current,
       power,
       SIGN(current) AS current_sign,
       SIGN(power) AS power_sign,
       CASE
         WHEN 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.1
  AND ABS(power) > 10
  AND ts >= '2024-01-01 10:00:00'
ORDER BY ts;

应用价值

  • 检测互感器接线错误
  • 识别计量配置问题
  • 保证计量准确性

示例 12: 能量流向趋势分析

目的:分析一段时间内能量流向的变化趋势,评估自发自用率。

sql 复制代码
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: 双向电能计量与分时计费

目的:在分布式光伏、储能等双向电能场景下,需要区分用电(正向)和发电(反向)进行分别计量和计费。

示例

sql 复制代码
-- 生成双向电能日报表
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_DATE
  AND ts < CURRENT_DATE + 1d
GROUP BY location;

场景 B: 逆功率保护与安全监测

目的:监测设备是否出现逆功率情况,及时触发保护机制,防止设备损坏或电网事故。

示例

sql 复制代码
-- 检测逆功率超标事件
SELECT ts,
       tbname AS meter_id,
       power,
       ABS(power) AS reverse_power
FROM meters
WHERE SIGN(power) = -1
  AND ABS(power) > 2000
  AND ts >= NOW - 1h
ORDER BY ts DESC;

场景 C: 光伏发电并网监测

目的:监测光伏逆变器的发电状态,统计发电时段和发电量,评估系统运行效率。

示例

sql 复制代码
-- 统计各电表的发电时长和发电量
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_DATE
  AND ts < CURRENT_DATE + 1d
GROUP BY location;

场景 D: 设备工况状态识别

目的:通过功率符号快速识别设备的运行状态(用电、发电、停机),简化状态机逻辑。

示例

sql 复制代码
-- 生成设备状态变化记录
SELECT ts,
       tbname,
       CASE
         WHEN 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: 计量异常检测

目的:检测电流和功率符号不一致、零功率异常等计量问题,及时发现互感器接线错误或传感器故障。

示例

sql 复制代码
-- 检测符号异常的数据
SELECT ts,
       tbname,
       current,
       power,
       SIGN(current) AS current_sign,
       SIGN(power) AS power_sign
FROM meters
WHERE SIGN(current) * SIGN(power) < 0
  AND ABS(current) > 0.1
  AND ABS(power) > 10
  AND ts >= NOW - 1d
ORDER BY ts DESC;

注意事项

  1. 数据类型一致性:SIGN 函数返回值类型与输入类型一致,整数输入返回整数,浮点输入返回浮点。

  2. 零值判断 :对于浮点数,由于精度问题,建议使用 ABS(value) < threshold 判断是否接近零,而不是直接使用 SIGN(value) = 0

  3. NULL 传播:输入为 NULL 时返回 NULL,在条件过滤中需注意 NULL 值的处理。

  4. 性能考虑:SIGN 是简单的标量函数,性能开销极小,可以放心在大数据集中使用。

  5. 与聚合函数配合:SIGN 不能直接与聚合函数混用,但可以嵌套在 CASE 表达式中实现分组统计。

  6. 符号稳定性:对于接近零的微小值,浮点运算可能导致符号不稳定,建议设置合理的阈值进行过滤。


数学关系

  • 基本定义

    • SIGN(x) = 1 当 x > 0
    • SIGN(x) = -1 当 x < 0
    • SIGN(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} 三值集合,是判断数值正负的标准方法。在数值计算、信号处理等领域有广泛应用。

实际应用价值

  1. 双向计量

    • 区分正向和反向电能
    • 支持分布式能源并网计量
    • 实现买电/卖电分离结算
  2. 状态识别

    • 快速判断设备运行模式
    • 简化状态机实现
    • 降低业务逻辑复杂度
  3. 异常检测

    • 识别逆功率异常
    • 检测计量符号错误
    • 预警设备故障
  4. 数据分类

    • 按正负分组统计
    • 实现条件聚合
    • 支持分段分析
  5. 业务规则

    • 实现逆功率保护
    • 支持能量流向控制
    • 满足电网接入要求

本用户手册提供了 SIGN 函数的完整使用说明,特别针对电力系统中的双向电能计量、逆功率监测、光伏并网等实际需求,所有示例均符合 TDengine 语法规范,方便用户快速上手并应用于生产环境。

关于 TDengine

TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。

它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。

相关推荐
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
深圳市恒星物联科技有限公司4 小时前
水质流量监测仪:复合指标监测的管网智能感知设备
大数据·网络·人工智能
·云扬·5 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师5 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
IT邦德5 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫5 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
是做服装的同学5 小时前
如何选择适合的服装企业ERP系统才能提升业务效率?
大数据·经验分享·其他
不爱缺氧i5 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.5 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql