

# SQL 推理
<a name="cloudwatch-metrics-insights-inference"></a>

CloudWatch Metrics Insights 使用多种机制来推断给定 SQL 查询的意图。

**Topics**
+ [时间分段](#cloudwatch-metrics-insights-inference-timebucketing)
+ [字段投影](#cloudwatch-metrics-insights-inference-fieldsprojection)
+ [ORDER BY 全局聚合](#cloudwatch-metrics-insights-inference-OrderBy)

## 时间分段
<a name="cloudwatch-metrics-insights-inference-timebucketing"></a>

根据请求的时段，查询生成的时间序列数据点将累计到时间段中。要在标准 SQL 中聚合值，必须定义一个明确的 GROUP BY 子句，以便一起收集给定时段的所有观测值。由于这是查询时间序列数据的标准方式，CloudWatch Metrics Insights 可推断时间分段，而无需明确表达 **GROUP BY** 子句。

例如，当执行时间为 1 分钟的查询时，属于该分钟的所有观测值，直到下一分钟（排除）为止，都将累计到该时间段的开始时间。这使得 Metrics Insights SQL 语句更加简洁明了。

```
SELECT AVG(CPUUtilization)
FROM SCHEMA("AWS/EC2", InstanceId)
```

上一个查询返回单个时间序列（时间戳值对），表示所有 Amazon EC2 实例的平均 CPU 使用率。假设请求的时段为 1 分钟，则返回的每个数据点代表在特定 1 分钟间隔（包括开始时间，不包括结束时间）内测量的所有观测值的平均值。与特定数据点相关的时间戳是时间段的开始时间

## 字段投影
<a name="cloudwatch-metrics-insights-inference-fieldsprojection"></a>

Metrcis Insights 查询始终返回时间戳投影。您不需要在 **SELECT** 子句中指定时间戳列来获取每个相应数据点值的时间戳。有关如何计算时间戳的详细信息，请参阅 [时间分段](#cloudwatch-metrics-insights-inference-timebucketing)。

使用 **GROUP BY** 时，还可以在结果中推断和投影每个组名称，以便您可以对返回的时间序列进行分组。

```
SELECT AVG(CPUUtilization)
FROM SCHEMA("AWS/EC2", InstanceId)
GROUP BY InstanceId
```

上一个查询将返回每个 Amazon EC2 实例的时间序列。每个时间序列都在实例 ID 的值之后进行标注。

## ORDER BY 全局聚合
<a name="cloudwatch-metrics-insights-inference-OrderBy"></a>

使用 **ORDER BY** 时、**FUNCTION()** 推断要按哪个聚合函数排序（查询指标的数据点值）。聚合操作在查询的时间窗口中对每个单独时间序列的所有匹配数据点执行。

```
SELECT AVG(CPUUtilization)
FROM SCHEMA("AWS/EC2", InstanceId)
GROUP BY InstanceId
ORDER BY MAX()
LIMIT 10
```

上一个查询返回每个 Amazon EC2 实例的 CPU 使用率，并将结果集限制为 10 个条目。结果根据请求的时间窗口内各个时间序列的最大值进行排序。**ORDER BY** 子句在 **LIMIT** 之前应用，以便根据 10 个以上的时间序列计算排序。