

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

# 統計資料
<a name="CWL_QuerySyntax-Stats"></a>

 使用 `stats` 建立日誌資料的視覺化效果，例如長條圖、折線圖和堆疊區域圖。這可協助您更有效地識別日誌資料中的模式。CloudWatch Logs Insights 可以為使用 `stats` 函數和一或多個彙總函數的查詢產生視覺效果。

例如，Route 53 日誌群組中的下列查詢會傳回視覺化效果，依查詢類型顯示每小時 Route 53 記錄的分佈情況。

```
stats count(*) by queryType, bin(1h)
```

所有這些查詢都可以產生長條圖。如果您的查詢使用 `bin()` 函式將資料以一個欄位與一段時間進行群組，那麼您也可以看到折線圖和堆疊區域圖。

`bin` 函數支援以下時間單位和縮寫。對於包含多個字元的所有單位和縮寫，支援加上 s 來表示複數。所以 `hr` 和 `hrs` 皆可用來指定時數。
+ `millisecond` `ms` `msec`
+ `second` `s` `sec`
+ `minute` `m` `min`
+ `hour` `h` `hr`
+ `day` `d` 
+ `week` `w` 
+ `month` `mo` `mon`
+ `quarter` `q` `qtr`
+ `year` `y` `yr`

**Topics**
+ [視覺化呈現時間序列資料](#CWL_Insights-Visualizing-TimeSeries)
+ [視覺化呈現依欄位分組的日誌資料](#CWL_Insights-Visualizing-ByFields)
+ [在單一查詢中使用多個統計資訊命令](#CWL_QuerySyntax-stats-multi)
+ [與統計資料搭配使用的函數](#CWL_QuerySyntax-stats-functions)

## 視覺化呈現時間序列資料
<a name="CWL_Insights-Visualizing-TimeSeries"></a>

時間序列視覺化適用於具有下列特性的查詢：
+ 查詢包含一或多個彙總函數。如需詳細資訊，請參閱[Aggregation Functions in the Stats Command](#CWL_Insights_Aggregation_Functions)。
+ 查詢使用 `bin()` 函數依一個欄位來分組資料。

這些查詢可以產生折線圖、堆疊區域圖、長條圖和圓餅圖。

**範例**

如需完整的教學，請參閱[教學課程：執行查詢來產生時間序列視覺化](CWL_AnalyzeLogData_VisualizationQuery.md)。

以下是更多適用於時間序列視覺化的查詢範例。

以下查詢為 `myfield1` 欄位的平均值產生視覺效果，其中每 5 分鐘建立一個資料點。每個資料點是日誌中前五分鐘的 `myfield1` 值的平均值彙總。

```
stats avg(myfield1) by bin(5m)
```

以下查詢根據不同欄位建立三個值的視覺效果，其中每 5 分鐘建立一個資料點。產生此覺化是因為查詢包含彙總函數，且使用 `bin()` 做為分組欄位。

```
stats avg(myfield1), min(myfield2), max(myfield3) by bin(5m)
```

**折線圖和堆疊區域圖限制**

彙總記錄項目資訊但不使用 `bin()` 函數的查詢可產生長條圖。不過，該查詢無法產生折線圖或堆疊區域圖。如需這些查詢類型的詳細資訊，請參閱 [視覺化呈現依欄位分組的日誌資料](#CWL_Insights-Visualizing-ByFields)。

## 視覺化呈現依欄位分組的日誌資料
<a name="CWL_Insights-Visualizing-ByFields"></a>

您可以為使用 `stats` 函數和一或多個彙總函數的查詢產生長條圖。如需詳細資訊，請參閱[Aggregation Functions in the Stats Command](#CWL_Insights_Aggregation_Functions)。

若要查看視覺化，請執行查詢。查詢 **Visualization (視覺化)** 標籤，選取 **Line (線條)** 旁邊的箭頭，然後選擇 **Bar (長條)**。長條圖中的視覺化限制為最多 100 個長條。

**範例**

如需完整的教學，請參閱[教學課程：執行查詢以產生依日誌欄位分組的視覺效果](CWL_AnalyzeLogData_VisualizationFieldQuery.md)。以下段落包含更多可依據欄位進行視覺化的查詢範例。

下列 VPC 流程日誌查詢會尋找每個目的地位址、每個工作階段傳輸的平均位元組數。

```
stats avg(bytes) by dstAddr
```

您也可以產生一個圖表，其中包含每個結果值的多個長條。例如，下列 VPC 流程日誌查詢會尋找每個目的地位址、每個工作階段傳輸的平均和最大位元組數。

```
stats avg(bytes), max(bytes) by dstAddr
```

下列查詢會尋找每個查詢類型的 Amazon Route 53 查詢日誌數量。

```
stats count(*) by queryType
```

## 在單一查詢中使用多個統計資訊命令
<a name="CWL_QuerySyntax-stats-multi"></a>

您可以在單一查詢中使用多達兩個 `stats` 命令。這讓能您在第一個彙總的輸出上執行額外的彙總。

**範例：使用兩個 `stats` 命令進行查詢**

例如，以下查詢會先找出 5 分鐘區間的總流量，然後計算這些 5 分鐘區間的最高、最低和平均流量。

```
FIELDS strlen(@message) AS message_length
| STATS sum(message_length)/1024/1024 as logs_mb BY bin(5m)
| STATS max(logs_mb) AS peak_ingest_mb, 
        min(logs_mb) AS min_ingest_mb, 
        avg(logs_mb) AS avg_ingest_mb
```

**範例：將多個統計資料命令與其他函數 (例如 `filter`、`fields`、`bin`) 相結合**

您可以在單一命令中，將兩個 `stats` 命令與其他命令（例如 `filter` 和 `fields`) 相結合。例如，以下查詢會尋找工作階段中不同 IP 地址的數目，並依用戶端平台尋找工作階段數目，篩選這些 IP 地址，最後再找出每個用戶端平台的工作階段請求的平均數。

```
STATS count_distinct(client_ip) AS session_ips, 
      count(*) AS requests BY session_id, client_platform
| FILTER session_ips > 1
| STATS count(*) AS multiple_ip_sessions, 
        sum(requests) / count(*) AS avg_session_requests BY client_platform
```

您可以在具有多個 `stats` 命令的查詢中使用 `bin` 和 `dateceil` 函數。例如，以下查詢會先將訊息合併成 5 分鐘的區塊，然後將這些 5 分鐘的區塊彙總為 10 分鐘的區塊，並計算每個 10 分鐘區塊內的最高、最低和平均流量。

```
FIELDS strlen(@message) AS message_length
| STATS sum(message_length) / 1024 / 1024 AS logs_mb BY BIN(5m) as @t
| STATS max(logs_mb) AS peak_ingest_mb, 
        min(logs_mb) AS min_ingest_mb,
        avg(logs_mb) AS avg_ingest_mb BY dateceil(@t, 10m)
```

**備註與限制**

查詢最多可以有兩個 `stats` 命令。此配額無法變更。

如果您使用一個 `sort` 或 `limit` 命令，則其必須出現在第二個 `stats` 命令之後。如果在第二個 `stats` 命令之前，查詢無效。

當查詢有兩個 `stats` 命令時，在第一個 `stats` 彙總完成之前，不會開始顯示查詢的部分結果。

在單一查詢的第二個 `stats` 命令中，您只能參照第一個 `stats` 命令中定義的欄位。例如，以下查詢無效，因為 `@message` 欄位要在第一次 `stats` 彙總之後才可以使用。

```
FIELDS @message
| STATS SUM(Fault) by Operation
# You can only reference `SUM(Fault)` or Operation at this point
| STATS MAX(strlen(@message)) AS MaxMessageSize # Invalid reference to @message
```

您在第一個 `stats` 命令之後參照的任何欄位，都必須在該第一個 `stats` 命令中定義。

```
STATS sum(x) as sum_x by y, z
| STATS max(sum_x) as max_x by z
# You can only reference `max(sum_x)`, max_x or z at this point
```

**重要**  
`bin` 函數始終以隱含的方式使用 `@timestamp` 欄位。這表示如果不使用第一個 `stats` 命令傳播 `timestamp` 欄位，就無法在第二個 `stats` 命令中使用 `bin`。例如，以下查詢無效。  

```
FIELDS strlen(@message) AS message_length
 | STATS sum(message_length) AS ingested_bytes BY @logStream
 | STATS avg(ingested_bytes) BY bin(5m) # Invalid reference to @timestamp field
```
因此，應在第一個 `stats` 命令中定義 `@timestamp` 欄位，然後就可以在第二個 `stats` 命令中用來與 `dateceil` 搭配使用，如以下範例所示。  

```
FIELDS strlen(@message) AS message_length
 | STATS sum(message_length) AS ingested_bytes, max(@timestamp) as @t BY @logStream
 | STATS avg(ingested_bytes) BY dateceil(@t, 5m)
```

## 與統計資料搭配使用的函數
<a name="CWL_QuerySyntax-stats-functions"></a><a name="CWL_Insights_Aggregation_Functions"></a>

CloudWatch Logs Insights 支援統計資料彙總函數和統計資料非彙總函數。

 在 `stats` 命令中使用統計資料彙總函數，並用作其他函數的引數。


| 函式 | 結果類型 | Description | 
| --- | --- | --- | 
|  `avg(fieldName: NumericLogField)` |  number |  所指定欄位中的值的平均數。  | 
|  `count()` `count(fieldName: LogField)` |  number |  計算日誌事件數。`count()` (或 `count(*)`) 計算查詢傳回的所有事件數，`count(fieldName)` 計算包含指定欄位名稱的所有記錄數。  | 
|  `count_distinct(fieldName: LogField)` |  number |  傳回欄位的唯一值數目。如果欄位有極高的基數 (包含許多唯一值)，則 `count_distinct` 傳回的值只是近似值。  | 
|  `max(fieldName: LogField)` |  LogFieldValue |  在所查詢的日誌中此日誌欄位的值上限。  | 
|  `min(fieldName: LogField)` |  LogFieldValue |  在所查詢的日誌中此日誌欄位的值下限。  | 
|  `pct(fieldName: LogFieldValue, percent: number)` |  LogFieldValue |  百分位數會指出資料集中相關準備好的值。例如，`pct(@duration, 95)` 傳回 `@duration` 值，其中 `@duration` 的值有 95% 低於這個值，有 5% 高於這個值。  | 
|  `stddev(fieldName: NumericLogField)` |  number |  所指定欄位中的值的標準差。  | 
|  `sum(fieldName: NumericLogField)` |  number |  所指定欄位中的值的總和。  | 

 **Stats 非彙總函數** <a name="CWL_Insights_Non-Aggregation_Functions"></a>

 非彙總函數可用於 `stats` 命令，也可以作為其他函數的引數使用。


| 函式 | 結果類型 | Description | 
| --- | --- | --- | 
|  `earliest(fieldName: LogField)` |  LogField |  從在查詢日誌中具有最早時間戳記的日誌事件中傳回 `fieldName` 的值。  | 
|  `latest(fieldName: LogField)` |  LogField |  從在查詢日誌中具有最晚時間戳記的日誌事件中傳回 `fieldName` 的值。  | 
|  `sortsFirst(fieldName: LogField)` |  LogField |  傳回在查詢日誌中最先排序的 `fieldName` 值。  | 
|  `sortsLast(fieldName: LogField)` |  LogField |  傳回在查詢日誌中最後排序的 `fieldName` 值。  | 