

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

# WINDOW 子句 (滑动窗口)
<a name="sql-reference-window-clause"></a>

滑动窗口式查询的 `WINDOW` 子句指定一些行，将跨与当前行相关的一组行针对这些行计算分析函数。这些聚合函数生成一个输出行，该行按每个输入行的一个或多个列中的键进行聚合。查询中的 `WINDOW` 子句指定流中按时间范围间隔或行数分区的记录，以及由 `PARTITION BY` 子句指定的一组额外的可选列。您可以定义指定的或内联的窗口规范，这些规范可在分析函数和流式 `JOIN` 子句中使用。有关分析函数的更多信息，请参阅[分析函数](sql-reference-analytic-functions.md)。

对 `OVER` 子句中指定的每个列执行滑动窗口查询中的聚合函数。`OVER` 子句可以引用指定的窗口规范，也可以作为数据泵的 `SELECT` 语句的一部分内联。以下示例说明如何使用 `OVER` 子句引用指定的窗口规范并在 `SELECT` 语句中内联使用。

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

```
[WINDOW window_name AS 
(
	{PARTITION BY partition_name 
		RANGE INTERVAL 'interval' {SECOND | MINUTE | HOUR} PRECEDING | 
		ROWS number PRECEDING
, …}
)
```

## OVER 子句
<a name="w2aac20c15c30b9"></a>

以下示例说明如何使用 `OVER` 子句引用指定的窗口规范。

**示例 1：引用指定的窗口规范的 OVER**

以下示例显示的是引用了名为 W1 的窗口规范的聚合函数。在此示例中，基于 `W1` 窗口规范所指定的记录集来计算平均价格。要了解有关如何将 OVER 子句与窗口规范结合使用的更多信息，请参阅[示例](#sql-reference-window-clause-examples)。

```
AVG(price) OVER W1 AS avg_price 
```

**示例 2：引用内联窗口规范的 OVER**

 以下示例显示的是引用了内联窗口规范的聚合函数。在此示例中，基于每个输入行与内联窗口规范来计算平均价格。要了解有关如何将 OVER 子句与窗口规范结合使用的更多信息，请参阅[示例](#sql-reference-window-clause-examples)。

```
AVG(price) OVER (
    PARTITION BY ticker_symbol
    RANGE INTERVAL '1' HOUR PRECEDING) AS avg_price
```

有关聚合函数和 OVER 子句的更多信息，请参阅[聚合函数](sql-reference-aggregate-functions.md)。

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

*window-name*

指定可从 OVER 子句或后续窗口定义引用的唯一名称。此名称在分析函数和流式 `JOIN` 子句中使用。有关分析函数的更多信息，请参阅[分析函数](sql-reference-analytic-functions.md)。

AS

为 `WINDOW` 子句定义指定的窗口规范。

PARTITION BY *partition-name*

将行划分到共享相同值的组中。在对行进行划分后，窗口函数将计算当前行所在划分中的所有行。

RANGE INTERVAL *'interval'* \$1SECOND \$1 MINUTE \$1 HOUR\$1 PRECEDING

根据时间范围间隔指定窗口边界。窗口函数将计算具有与当前行相同的时间间隔的所有行。

ROWS *number* PRECEDING

根据行数指定窗口边界。窗口函数将计算在相同行数内的所有行。

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

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

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

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

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

### 示例 1：引用了指定的窗口规范的基于时间的滑动窗口
<a name="w2aac20c15c30c13b5"></a>

此示例定义了一个指定的窗口规范，其分区边界为当前行前一分钟。数据泵的 `OVER` 语句的 `SELECT` 子句引用指定的窗口规范。

```
WINDOW W1 AS (
    PARTITION BY ticker_symbol 
    RANGE INTERVAL '1' MINUTE PRECEDING);
```

要运行此示例，请创建股票示例应用程序，并运行和保存以下 SQL 代码。

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

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

![\[Table showing stock data with columns for rowtime, ticker symbol, and price information.\]](http://docs.amazonaws.cn/kinesisanalytics/latest/sqlref/images/sql-reference-analytic-functions-example-1.png)


### 示例 2：引用了指定的窗口规范的基于行的滑动窗口
<a name="w2aac20c15c30c13b7"></a>

此示例定义了一个指定的窗口规范，其分区边界为当前行前两到十行。数据泵的 `OVER` 语句的 `SELECT` 子句引用指定的窗口规范。

```
 WINDOW
    last2rows AS (PARTITION BY ticker_symbol ROWS 2 PRECEDING),
    last10rows AS (PARTITION BY ticker_symbol ROWS 10 PRECEDING);
```

要运行此示例，请创建股票示例应用程序，并运行和保存以下 SQL 代码。

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
    ticker_symbol      VARCHAR(4), 
    price              DOUBLE, 
    avg_last2rows      DOUBLE, 
    avg_Last10rows     DOUBLE);
CREATE OR REPLACE PUMP "myPump" AS INSERT INTO "DESTINATION_SQL_STREAM"
SELECT STREAM ticker_symbol, 
    price, 
    AVG(price) OVER last2rows, 
    AVG(price) OVER last10rows
FROM SOURCE_SQL_STREAM_001
WINDOW
    last2rows AS (PARTITION BY ticker_symbol ROWS 2 PRECEDING),
    last10rows AS (PARTITION BY ticker_symbol ROWS 10 PRECEDING);
```

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

![\[Table showing stock ticker symbols, prices, and average values for multiple rows.\]](http://docs.amazonaws.cn/kinesisanalytics/latest/sqlref/images/sql-reference-analytic-functions-example-2.png)


### 示例 3：带内联窗口规范的基于时间的滑动窗口
<a name="w2aac20c15c30c13b9"></a>

此示例定义了一个内联窗口规范，其分区边界为当前行前一分钟。数据泵的 `OVER` 语句的 `SELECT` 子句使用内联窗口规范。

要运行此示例，请创建股票示例应用程序，并运行和保存以下 SQL 代码。

```
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
    ticker_symbol VARCHAR(4),
    price         DOUBLE,
    avg_price     DOUBLE);
CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
    INSERT INTO "DESTINATION_SQL_STREAM"
    SELECT STREAM ticker_symbol, price, 
        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, price, and average price.\]](http://docs.amazonaws.cn/kinesisanalytics/latest/sqlref/images/sql-reference-analytic-functions-example-3.png)


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

### 
<a name="w2aac20c15c30c15b2"></a>

对于 WINDOW 子句和终端节点，Amazon Kinesis Analytics SQL 在某个范围内遵循窗口的 SQL-2008 标准。

要包括 1 小时的终端节点，您可以使用以下窗口语法。

```
WINDOW HOUR AS (RANGE INTERVAL '1' HOUR PRECEDING) 
```

要排除上一个小时的终端节点，您可以使用以下窗口语法。

```
WINDOW HOUR AS (RANGE INTERVAL '59:59.999' MINUTE TO SECOND(3) PRECEDING);
```

有关更多信息，请参阅 [允许和不允许的窗口规范](sql-reference-allowed-disallowed-window.md)。

## 相关主题
<a name="w2aac20c15c30c17"></a>
+ 《Kinesis 开发人员指南》中的[滑动窗口](https://docs.amazonaws.cn/kinesisanalytics/latest/dev/sliding-window-concepts.html)
+ [聚合函数](sql-reference-aggregate-functions.md)
+ [SELECT 语句](sql-reference-select.md)
+ [CREATE STREAM](sql-reference-create-stream.md) statement
+ [CREATE PUMP](sql-reference-create-pump.md) statement