

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

# AVG
<a name="sql-reference-avg"></a>

从窗口式查询返回一组值的平均值。根据时间或行定义窗口式查询。有关窗口式查询的信息，请参阅[窗口式查询](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/windowed-sql.html)。要返回在指定时间窗口内选择的值表达式的流的指数加权平均值，请参阅 [EXP\$1AVG](sql-reference-exp-avg.md)。

在使用 AVG 时，请注意以下事项：
+ 如果您未使用 `OVER` 子句，则 `AVG` 将作为聚合函数进行计算。在这种情况下，聚合查询必须根据将流分组到有限行中的 `ROWTIME` 在单调表达式中包含 [GROUP BY 子句](sql-reference-group-by-clause.md)。否则，组将是无限流，并且查询永远无法完成，也不会输出任何行。有关更多信息，请参阅 [聚合函数](sql-reference-aggregate-functions.md)。
+ 使用 GROUP BY 子句的窗口式查询在滚动窗口中处理行。有关更多信息，请参阅[滚动窗口（使用 GROUP BY 的聚合）](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/tumbling-window-concepts.html)。
+ 如果您使用 `OVER` 子句，则 `AVG` 将作为分析函数进行计算。有关更多信息，请参阅 [分析函数](sql-reference-analytic-functions.md)。
+ 使用 OVER 子句的窗口式查询在滑动窗口中处理行。有关更多信息，请参阅[滑动窗口](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/sliding-window-concepts.html) 

## 语法
<a name="w2aac22b7c30b9"></a>

### 滚动窗口式查询
<a name="w2aac22b7c30b9b2"></a>

```
AVG(number-expression) ... GROUP BY monotonic-expression | time-based-expression
```

### 滑动窗口式查询
<a name="w2aac22b7c30b9b4"></a>

```
AVG([DISTINCT | ALL] number-expression) OVER window-specification
```

## 参数
<a name="w2aac22b7c30c11"></a>

DISTINCT

仅对值的每个唯一实例执行聚合函数。

ALL

对所有值执行聚合函数。`ALL` 为默认值。

*number-expression*

指定针对聚合中的每一行计算的值表达式。

OVER *window-specification*

划分流中按时间范围间隔或行数分区的记录。窗口规范定义流中记录的划分方式 (按时间范围间隔或行数)。

按*单调*表达式分组 \$1 *time-based-expression*

基于分组表达式的值为记录分组，从而针对在所有列中具有相同值的每组行返回一个摘要行。

## 示例
<a name="sql-reference-avg-examples"></a>

### 示例数据集
<a name="w2aac22b7c30c13b2"></a>

以下示例基于样本股票数据集，后者是 *Amazon Kinesis Analytics 开发人员指南*中的[入门练习](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)的一部分。要运行每个示例，您需要一个具有样本股票代码输入流的 Amazon Kinesis Analytics 应用程序。要了解如何创建 Analytics 应用程序和配置样本股票代码输入流，请参阅 *Amazon Kinesis Analytics 开发人员指南*中的[入门](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)。

具有以下架构的示例股票数据集。

```
(ticker_symbol  VARCHAR(4),
sector          VARCHAR(16),
change          REAL,
price           REAL)
```

### 示例 1：使用 GROUP BY 子句返回平均值
<a name="avg_example_1"></a>

在此示例中，聚合查询在 `ROWTIME` 上有一个 `GROUP BY` 子句，可将流分组到有限行中。随后，从 `AVG` 子句返回的行计算 `GROUP BY` 函数。

#### 使用 STEP（推荐）
<a name="avg_example_1_step"></a>

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
    ticker_symbol VARCHAR(4), 
    avg_price     DOUBLE);  
    
CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
  INSERT INTO "DESTINATION_SQL_STREAM" 
    SELECT STREAM 
        ticker_symbol,
        AVG(price) AS avg_price
    FROM "SOURCE_SQL_STREAM_001"
    GROUP BY ticker_symbol, 
        STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND);
```

#### 使用 FLOOR
<a name="avg_example_1_floor"></a>

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
    ticker_symbol VARCHAR(4), 
    avg_price     DOUBLE);  

CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
  INSERT INTO "DESTINATION_SQL_STREAM" 
    SELECT STREAM 
        ticker_symbol,
        AVG(price) AS avg_price
    FROM "SOURCE_SQL_STREAM_001"
    GROUP BY ticker_symbol, 
        FLOOR("SOURCE_SQL_STREAM_001".ROWTIME TO MINUTE);
```

#### 结果
<a name="avg_example_1_results"></a>

上一示例输出的流与以下内容类似。

![\[Table showing stock ticker symbols NFS, WAS, PPL, ALY with corresponding dates and average prices.\]](http://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/images/sql-reference-avg-example-1.png)


### 示例 2：使用 OVER 子句返回平均值
<a name="w2aac22b7c30c13b6"></a>

 在此示例中，`OVER` 子句划分流中按之前“1”小时的时间范围间隔分区的记录。随后，从 `AVG` 子句返回的行计算 `OVER` 函数。

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
    ticker_symbol VARCHAR(4),
    avg_price     DOUBLE);
CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
    INSERT INTO "DESTINATION_SQL_STREAM"
    SELECT STREAM ticker_symbol, 
        AVG(price) OVER (
            PARTITION BY ticker_symbol
            RANGE INTERVAL '1' HOUR PRECEDING) AS avg_price
    FROM "SOURCE_SQL_STREAM_001"
```

上一示例输出的流与以下内容类似。

![\[Table showing stock data with columns for timestamp, ticker symbol, and average price.\]](http://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/images/sql-reference-avg-example-2.png)


## 使用说明
<a name="w2aac22b7c30c15"></a>

Amazon Kinesis Analytics 不支持应用于间隔类型的 `AVG`。此功能偏离了 SQL:2008 标准。

 当用作分析函数时，如果所计算的窗口不包含任何行，或者所有行均包含 null 值，则 `AVG` 将返回 null。有关更多信息，请参阅[分析函数](sql-reference-analytic-functions.md)。AVG 还为 `PARTITION BY` 子句返回 null，在这种情况下，窗口中匹配输入行的分区不包含任何行或所有行均为 null。有关 `PARTITION BY`的更多信息，请参阅[WINDOW 子句 (滑动窗口)](sql-reference-window-clause.md)。

 `AVG` 会忽略来自值集或数字表达式的 null 值。例如，以下各项返回值 2：
+ AVG(1, 2, 3) = 2
+ AVG(1,null, 2, null, 3, null) = 2

## 相关主题
<a name="w2aac22b7c30c17"></a>
+ [窗口式查询](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/windowed-sql.html)
+ [EXP\$1AVG](sql-reference-exp-avg.md)
+ [聚合函数](sql-reference-aggregate-functions.md)
+ [GROUP BY 子句](sql-reference-group-by-clause.md)
+ [分析函数](sql-reference-analytic-functions.md)
+ [入门练习](https://docs.aws.amazon.com/kinesisanalytics/latest/dev/get-started-exercise.html)
+ [WINDOW 子句 (滑动窗口)](sql-reference-window-clause.md)