

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 公式表達式教學課程
<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 (true) 或 0 (false)。如需詳細資訊，請參閱[未定義、無限和溢出值](#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`函數的轉換來定義條件，以檢查是否符合條件，並傳回 `none` `result_if_true`或 `result_if_false`值。

**Example 範例：篩選出水未沸騰的資料點**  
假設您有提供機器中水溫 `temp_c`（攝氏） 的測量 。您可以定義下列轉換，以篩選出水未沸騰的資料點：  
+ 轉換： `boiling_temps = if(gte(temp_c, 100), temp_c, none)` – 如果溫度大於或等於攝氏 100 度，則傳回溫度，否則不會傳回任何資料點。

## 計數符合條件的資料點
<a name="count-filtered-data"></a>

您可以使用[比較函數](expression-comparison-functions.md)和 [sum()](expression-aggregation-functions.md#sum-definition) 來計算條件為 true 的資料點數目。

**計算符合條件的資料點**

1. 建立使用比較函數在另一個屬性上定義篩選條件的轉換。

1. 建立可加總符合該條件之資料點的指標。

**Example 範例：計算水沸騰的資料點數量**  
假設您有提供機器中水溫 `temp_c`（攝氏） 的測量 。您可以定義下列轉換和指標屬性，以計算水沸騰的資料點數量：  
+ 轉換： `is_boiling = gte(temp_c, 100)` – `1` 如果溫度大於或等於攝氏 100 度，則傳回 ，否則傳回 `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 無法表示為 number 的值。當計算這些公式表達式時， AWS IoT SiteWise 不會輸出資料點。  
+ `x / 0` 未定義。
+ `log(0)` 未定義。
+ `sqrt(-1)` 在實數系統中未定義。
+ `"hello" + " world"` 是字串。
+ `jp('{"values":[3,6,7]}', '$.values')` 是陣列。
+ `if(gte(temp, 300), temp, none)` 當 小於 `none`時`temp`， 為 `300`。