特性规则表达式说明¶
特性规则的表达式用于定义不同特性之间的逻辑关系,映射单个模型或多个模型之间的特性数值。
例如,当前模型中已包含 GenActivePW
和 Capacity
特性,需要添加一个新特性 GenActivePWRatio
,GenActivePWRatio
的数值可以通过 GenActivePW
和 Capacity
计算而来,则可以为 GenActivePWRatio
配置以下特性表达式:
“GenActivePW” * 100 / “Capacity”
特性表达式由特性(包含属性,测点),操作符和函数 3 个部分组成。
特性¶
插入特性时,需要插入特性标识符,使用半角双引号包含,且大小写敏感。
操作符¶
分类 |
操作符 |
示例 |
说明 |
---|---|---|---|
四则运算 |
3 + 2 |
加法 |
|
四则运算 |
3 - 2 |
减法 |
|
四则运算 |
3 * 2 |
乘法 |
|
四则运算 |
/ |
3 / 2.0 |
除法 |
四则运算 |
% |
3 % 2 |
求余 |
逻辑运算 |
> |
3 > 2 |
大于 |
逻辑运算 |
>= |
3 >= 2 |
大于等于 |
逻辑运算 |
< |
3 < 2 |
小于 |
逻辑运算 |
<= |
3 <= 2 |
小于等于 |
逻辑运算 |
= |
3 = 2 |
等于 |
逻辑运算 |
!= |
3 != 2 |
不等于 |
逻辑运算 |
and |
a > 1 and b > 2 |
并且 |
逻辑运算 |
or |
a > 1 or b > 2 |
或 |
条件判断 |
CASE |
CASE |
三元表达式 |
条件判断 |
COALESCE |
COALESCE(NULL, ‘a’, ‘b’) |
返回第一个非空参数 |
函数¶
计算函数¶
分类 |
函数 |
示例 |
说明 |
---|---|---|---|
数值处理函数 |
ABS |
ABS(-2) |
返回绝对值 |
数值处理函数 |
EXP |
EXP(2) |
返回无理数 e 的幂 |
数值处理函数 |
FLOOR |
FLOOR(3.6) |
向下取整 |
数值处理函数 |
ROUND |
ROUND(1.5) |
四舍五入 |
数值处理函数 |
CEILING |
CEILING(1.01) |
向上取整 |
数值处理函数 |
LN |
LN(2.7) |
返回以无理数 e 为底的对数,e 约等于 2.71828 |
数值处理函数 |
LOG10 |
LOG10(100) |
返回以 10 为底的对数 |
数值处理函数 |
SQRT |
SQRT(3) |
返回平方根 |
数值处理函数 |
POWER |
POWER(2, 3) |
幂运算 |
数值处理函数 |
RAND |
RAND() |
返回 0-1 之间的随机数 |
字符串处理函数 |
LENGTH |
LENGTH(‘abc’) |
返回字符串的字符数 |
字符串处理函数 |
CONCAT |
CONCAT(‘a’, ‘b’, ‘c’) |
字符串拼接,任一参数为空,则返回空 |
字符串处理函数 |
LOWER |
LOWER(‘A’) |
将字符串转为小写 |
字符串处理函数 |
UPPER |
UPPER(‘a’) |
将字符串转为大写 |
字符串处理函数 |
TRIM |
TRIM(’ a ‘) |
删除字符串开头结尾的空格 |
字符串处理函数 |
REPLACE |
REPLACE(‘acb’, ‘cb’, ‘e’) |
字符串替换,例如 REPLACE(‘acb’, ‘cb’, ‘e’) 表示将 acb 中的 cb 替换为 e,将返回 ae |
字符串处理函数 |
SUBSTRING |
SUBSTRING(‘abc’, 1, 2) |
返回子字符串, |
时间处理函数 |
CURRENT_DATE |
CURRENT_DATE |
返回当前日期 |
时间处理函数 |
CURRENT_TIME |
CURRENT_TIME |
返回当前时间 |
时间处理函数 |
CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP |
返回当前时间戳 |
时间处理函数 |
YEAR |
YEAR(CURRENT_TIMESTAMP) |
返回年份 |
时间处理函数 |
QUARTER |
QUARTER(CURRENT_TIMESTAMP) |
返回季度 |
时间处理函数 |
MONTH |
MONTH(CURRENT_TIMESTAMP) |
返回月份 |
时间处理函数 |
WEEK |
WEEK(CURRENT_TIMESTAMP) |
返回周,值为数字 1-53 |
时间处理函数 |
HOUR |
HOUR(CURRENT_TIMESTAMP) |
返回小时 |
时间处理函数 |
MINUTE |
MINUTE(CURRENT_TIMESTAMP) |
返回分钟 |
时间处理函数 |
SECOND |
SECOND(CURRENT_TIMESTAMP) |
返回秒 |
时间处理函数 |
CONVERT_TZ |
CONVERT_TZ(‘2024-03-01 16:20:20’, ‘Asia/Shanghai’, ‘America/Los_Angeles’) |
时区转换,将第一个参数从一个时区转换到另一个时区 |
时间处理函数 |
FORMAT_DATE |
FORMAT_DATE(CURRENT_DATE, ‘yyyy-MM’) |
日期格式化 |
时间处理函数 |
FORMAT_TIME |
FORMAT_TIME(CURRENT_TIME, ‘HH:mm’) |
时间格式化 |
时间处理函数 |
FORMAT_DATETIME |
FORMAT_DATETIME(CURRENT_TIMESTAMP, ‘yyyy-MM-dd HH:mm’) |
日期时间格式化 |
时间处理函数 |
ADD_DATETIME |
ADD_DATETIME(‘QUARTER’, 1, ‘2024-03-01 16:20:20’) |
时间偏移 |
JSON 处理函数 |
JSON_VALUE |
JSON_VALUE(‘{“foo”: 100}’, ‘$.foo’) |
从 JSON 字符串中提取指定路径的表达式 |
数组处理函数 |
SPLIT_TO_STR_ARRAY |
SPLIT_TO_STR_ARRAY(‘1,2,3’, ‘,’) |
将字符串切分成字符串数组,默认按逗号分割 |
数组处理函数 |
SPLIT_TO_INT_ARRAY |
SPLIT_TO_INT_ARRAY(‘1,2,3’, ‘,’) |
将字符串切分成整型数组,默认按逗号分割 |
数组处理函数 |
ARRAY_SIZE |
ARRAY_SIZE(SPLIT_TO_STR_ARRAY(‘1,2,3’)) |
计算数组长度 |
数组处理函数 |
ARRAY_REMOVE |
ARRAY_REMOVE(SPLIT_TO_INT_ARRAY(‘1,2,3’), ‘>=’, 2) |
从数组中按条件移除元素,其中支持以下运算符:=,!=,<,<=,>,>= |
数组处理函数 |
ARRAY_CONTAINS |
ARRAY_CONTAINS(SPLIT_TO_INT_ARRAY(‘1,2,3’), 3) |
查询数组中是否包含指定元素 |
数组处理函数 |
ARRAY_MAX |
ARRAY_MAX(SPLIT_TO_STR_ARRAY(‘1,2,3’, ‘,’)) |
求数组最大值 |
数组处理函数 |
ARRAY_MIN |
ARRAY_MIN(SPLIT_TO_INT_ARRAY(‘1,2,3’, ‘,’)) |
求数组最小值 |
聚合函数¶
聚合函数仅支持测点类型的特性表达式。
函数 |
示例 |
说明 |
---|---|---|
SUM |
SUM(2) |
求和 |
AVG |
AVG(2) |
求平均 |
MIN |
MIN(2) |
求最小值 |
MAX |
MAX(2) |
求最大值 |
COUNT |
COUNT(2) |
求记录数 |
常用表达式模板¶
以下列出常用的表达式模板。
数值判断¶
该模板常用于判断表达式的因子及相互之间的关系是否符合业务逻辑,并在不符合业务逻辑时输出一个默认值或空值。
当 sum("INV.AcPower") > sum("INV.DcPower")
时,输出空值,否则输出 (sum("INV.AcPower") * 100) / sum("INV.DcPower")
。
CASE WHEN (sum("INV.AcPower") > sum("INV.DcPower"))
THEN null
ELSE ((sum("INV.AcPower") * 100) / sum("INV.DcPower")) END
空值转换¶
该模板常用于多个因子连加的场景中,避免单个加数为空值导致的整个指标输出为空值的情况。
COALESCE 语句将返回第一个非空参数。对于 COALESCE(sum("INV.RecoverableProduction"), 0)
,如果 sum("INV.RecoverableProduction")
为空,则返回 0,否则返回 sum("INV.RecoverableProduction")
的值。
(COALESCE(sum("INV.RecoverableProduction"), 0) + COALESCE(sum("INV.ActualProdLoss"), 0))
强制聚合方式¶
该模板常用于表达式中指标计算存在多重聚合的场景,采用强制求和的聚合方式,而忽略原有指标的默认聚合方式。
即使原始指标 “SITE.Radiation2ACC” 和 “SITE.ConvertedCapacity” 有其他的聚合方式,在 SUM 表达式中也会先计算 “SITE.Radiation2ACC” * “SITE.ConvertedCapacity”,然后求和。
SUM("SITE.Radiation2ACC" * "SITE.ConvertedCapacity") / SUM("SITE.ConvertedCapacity")
聚合过滤¶
该模板用于多个数值聚合时过滤空值的场景。如果单个对象有一个或以上的因子为空,则不参与多对象的聚合计算。如果不使用该语法,则默认表示仅当单个对象的全部因子都为空时才不参与多对象的聚合计算。
SUM(CASE
WHEN "Radiation2ACC" IS NULL OR "ConvertedCapacity" IS NULL
THEN NULL
ELSE "Radiation2ACC" * "ConvertedCapacity"
END)
/
SUM(CASE
WHEN "Radiation2ACC" IS NULL OR "ConvertedCapacity" IS NULL
THEN NULL
ELSE "ConvertedCapacity"
END)
JSON 解析¶
该模板可从 JSON 数据中提取指定字段的值,例如从逆变器的状态属性数据中提取 ‘DELIVERY’ 的值,判断该设备当前是否处于已安装(Delivered)的状态,并返回相应的标识值(1 或 0)。
CASE WHEN (json_value(max("INV.StateAttr"),'DELIVERY') != 0)
THEN 1
ELSE 0
END
上期¶
该模板可用于查询某一数据的上一期数据,当查询时段为 Day(1)~Day(N),则实际查询时段将转换为 Day(1-N)~Day(0)。假设指标的查询时段为 2024 年 4 月 1 日至 4 月 5 日,增加 LP 后,查询时段将更新为 2024 年 3 月 27 日至 3 月 31 日。
LP(sum("ActiveProduction"))
环比¶
该模板表示(当期指标/上期指标)× 100,乘以 100 便于搭配界面上的百分号“%”直接展示。
((sum("ActiveProduction") / LP(sum("ActiveProduction"))) * 100)
环比增长¶
该模板通过当期指标减去上期指标,得出环比增长的数值。
(sum("ActiveProduction") - LP(sum("ActiveProduction")))
环比增长率¶
该模板表示(当期指标 - 上期指标)/ 上期指标 × 100,乘以 100 便于搭配界面上的百分号“%”直接展示。
(((sum("ActiveProduction") - LP(sum("ActiveProduction"))) / LP(sum("ActiveProduction"))) * 100)
去年同期¶
该模板可用于查询某一数据的去年同期数据,当查询时段为 Day(1)~Day(N),则实际查询时段将转换为去年的 Day(1)~Day(N)。假设指标的查询时段为 2024 年 4 月 1 日至 4 月 5 日,增加 SPLY 后,查询时段将更新为 2023 年 4 月 1 日至 4 月 5 日。
SPLY(sum("ActiveProduction"))
年同比¶
该模板表示(当期指标 / 去年同期指标)× 100,乘以 100 便于搭配界面上的百分号“%”直接展示。
((sum("ActiveProduction") / SPLY(sum("ActiveProduction"))) * 100)
年同比增长¶
该模板将当期指标减去去年同期指标,得到年同比增长数值。
(sum("ActiveProduction") - SPLY(sum("ActiveProduction")))
年同比增长率¶
该模板表示(当期指标 - 去年同期指标)/ 上期指标 × 100,乘以 100 便于搭配界面上的百分号“%”直接展示。
(((sum("ActiveProduction") - SPLY(sum("ActiveProduction"))) / SPLY(sum("ActiveProduction"))) * 100)
上月同期¶
该模板可用于查询某一数据的上月同期数据,当查询时段为 Day(1)~Day(N),则实际查询时段将转换为上个月的 Day(1)~Day(N)。假设指标的查询时段为 2024 年 4 月 1 日至 4 月 5 日,增加 SPLM 后,查询时段将更新为 2024 年 3 月 1 日至 3 月 5 日。
SPLM(sum("ActiveProduction"))
月同比¶
该模板表示(当期指标 / 上月同期指标)× 100,乘以 100 便于搭配界面上的百分号“%”直接展示。
((sum("ActiveProduction") / SPLM(sum("ActiveProduction"))) * 100)
月同比增长¶
该模板表示当期指标减去上月同期指标,得到月同比增长值。
(sum("ActiveProduction") - SPLM(sum("ActiveProduction")))
月同比增长率¶
该模板表示(当期指标 - 上月同期指标)/ 上期指标 × 100,乘以 100 便于搭配界面上的百分号“%”直接展示。
(((sum("ActiveProduction") - SPLM(sum("ActiveProduction"))) / SPLM(sum("ActiveProduction"))) * 100)