

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 公式表达式教程
<a name="expression-tutorials"></a>

您可以按照这些教程在 AWS IoT SiteWise中使用公式表达式。

**Topics**
+ [在公式中使用字符串](#use-strings-in-formulas)
+ [筛选数据点](#filter-data)
+ [计算与条件匹配的数据点](#count-filtered-data)
+ [公式中的最新数据](#late-data)
+ [公式中的数据质量](#data-quality)
+ [未定义值、无限值和溢出值](#undefined-values)

## 在公式中使用字符串
<a name="use-strings-in-formulas"></a>

您可以对公式表达式中的字符串进行操作。您也可以从引用属性和测量属性的变量中输入字符串。

**重要**  
<a name="formula-output-rules"></a>公式表达式只能输出双精度值或字符串值。嵌套表达式可以输出其他数据类型，例如字符串，但整个公式的计算结果必须为数字或字符串。您可以使用 [jp 函数](expression-string-functions.md#jp-definition)将字符串转换为数字。布尔值必须为 1（真）或 0（假）。有关更多信息，请参阅 [未定义值、无限值和溢出值](#undefined-values)。

AWS IoT SiteWise 提供了可用于对字符串进行操作的以下公式表达式功能：
+ [字符串文字](expression-literals.md#string-literal-definition)
+ [索引运算符](expression-operators.md#index-operator-definition) (`s[index]`)
+ [切片运算符](expression-operators.md#slice-operator-definition) (`s[start:end:step]`)
+ [比较函数](expression-comparison-functions.md)，您可以使用它按[字典顺序](https://en.wikipedia.org/wiki/Lexicographic_order)比较字符串
+ [字符串函数](expression-string-functions.md)，包括可以解析序列化的 JSON 对象并将字符串转换为数字的 `jp` 函数

## 筛选数据点
<a name="filter-data"></a>

您可以使用 [if 函数](expression-conditional-functions.md#if-definition)筛选出不符合条件的数据点。`if` 函数计算条件并返回 `true` 和 `false` 结果的不同值。您可以使用 [无 常量](expression-constants.md#none-definition)`if` 函数的一个案例的输出，以丢弃该案例的数据点。

**筛选出与条件匹配的数据点**
+ 创建一个转换，该转换使用 `if` 函数定义一个条件，该条件检查条件是否满足，并以 `result_if_true` 或 `result_if_false` 值的形式返回 `none`。

**Example 示例：过滤掉水未沸腾的数据点**  
考虑您在其中有一个测量值的场景 `temp_c`，它提供水在机器中的温度（以摄氏度为单位）。您可以定义以下转换来过滤掉水未沸腾的数据点：  
+ 转换：`boiling_temps = if(gte(temp_c, 100), temp_c, none)` – 如果温度大于或等于 100 摄氏度，则返回温度，否则不返回任何数据点。

## 计算与条件匹配的数据点
<a name="count-filtered-data"></a>

您可以使用[比较函数](expression-comparison-functions.md)和 [求和](expression-aggregation-functions.md#sum-definition) 来计算条件为真的数据点的数量。

**计算与条件匹配的数据点**

1. 创建一个使用比较函数在另一个属性上定义筛选条件的转换。

1. 创建一个汇总满足该条件的数据点的指标。

**Example 示例：计算水沸腾的数据点数量**  
考虑您在其中有一个测量值的场景 `temp_c`，它提供水在机器中的温度（以摄氏度为单位）。您可以定义以下转换和指标属性来计算水沸腾的数据点数量：  
+ 转换：`is_boiling = gte(temp_c, 100)` – 如果温度大于或等于 100 摄氏度，则计算结果为返回 `1`，否则计算结果为返回 `0`。
+ 指标：`boiling_count = sum(is_boiling)` – 返回水沸腾的数据点数量。

## 公式中的最新数据
<a name="late-data"></a>

AWS IoT SiteWise 支持延迟摄取最长 7 天的数据。当 AWS IoT SiteWise 收到延迟数据时，它会重新计算过去窗口中输入延迟数据的任何指标的现有值。这些重新计算会产生数据处理费用。

**注意**  
在 AWS IoT SiteWise 计算输入后期数据的属性时，它使用每个属性的当前公式表达式。

在 AWS IoT SiteWise 重新计算某个指标的过去窗口后，它将替换该窗口的先前值。如果您为该指标启用了通知，则 AWS IoT SiteWise 还会发出属性值通知。这意味着，您可以对您以前收到了通知的相同属性和时间戳收到新属性值更新通知。如果应用程序或数据湖使用属性值通知，则必须使用新值更新上一个值，以便其数据准确无误。

## 公式中的数据质量
<a name="data-quality"></a>

在中 AWS IoT SiteWise，每个数据点都有一个质量代码，可以是以下代码之一：
+ `GOOD` – 数据不受任何问题的影响。
+ `BAD` – 数据受传感器故障等问题的影响。
+ `UNCERTAIN` – 数据受传感器不准确等问题的影响。

AWS IoT SiteWise 在计算变换和指标时仅消耗`GOOD`质量数据。 AWS IoT SiteWise 仅输出成功计算所需的`GOOD`质量数据。如果计算不成功，则 AWS IoT SiteWise 不会为该计算输出数据点。如果计算生成未定义值、无限值或溢出值，则会发生这种情况。

有关如何查询数据和按数据质量筛选的更多信息，请参阅[从中查询数据 AWS IoT SiteWise](query-industrial-data.md)。

## 未定义值、无限值和溢出值
<a name="undefined-values"></a>

某些公式表达式（例如`x / 0``sqrt(-1)`、或`log(0)`）会计算在实数系统中未定义的值、无限值或超出所 AWS IoT SiteWise支持的范围。当资产属性的表达式计算未定义、无限或溢出值时， AWS IoT SiteWise 不会为该计算输出数据点。

AWS IoT SiteWise 如果将非数值作为公式表达式的结果进行计算，也不会输出数据点。这意味着，如果您定义了一个计算字符串、数组或 [无 常量](expression-constants.md#none-definition)的公式，则 AWS IoT SiteWise 不会为该计算输出数据点。

**Example 示例**  
以下每个公式表达式生成的值都 AWS IoT SiteWise 不能表示为数字。 AWS IoT SiteWise 在计算这些公式表达式时不输出数据点。  
+ `x / 0` 未定义。
+ `log(0)` 未定义。
+ `sqrt(-1)` 在实数系统中未定义。
+ `"hello" + " world"` 是一个字符串。
+ `jp('{"values":[3,6,7]}', '$.values')` 是一个数组。
+ 当 `temp` 小于 `300` 时，`if(gte(temp, 300), temp, none)` 等于 `none`。