

经过仔细考虑，我们决定停用适用于 SQL 应用程序的 Amazon Kinesis Data Analytics：

1. 从 **2025年9月1日起，**我们将不再为适用于SQL应用程序的Amazon Kinesis Data Analytics Data Analytics提供任何错误修复，因为鉴于即将停产，我们对其的支持将有限。

2. 从 **2025 年 10 月 15 日**起，您将无法为 SQL 应用程序创建新的 Kinesis Data Analytics。

3. 从 **2026 年 1 月 27 日**起，我们将删除您的应用程序。您将无法启动或操作 Amazon Kinesis Data Analytics for SQL 应用程序。从那时起，将不再提供对 Amazon Kinesis Data Analytics for SQL 的支持。有关更多信息，请参阅 [Amazon Kinesis Data Analytics for SQL 应用程序停用](discontinuation.md)。

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

# 滚动窗口（使用 GROUP BY 组的聚合）
<a name="tumbling-window-concepts"></a>

当一个窗口式查询以非重叠方式处理每个窗口时，这样的窗口称为*滚动窗口*。在这种情况下，应用程序内部流上的每个记录属于特定窗口。它只处理一次（当查询处理记录所属的窗口时）。

![\[Timeline showing non-overlapping windows processing data streams at distinct time intervals.\]](http://docs.amazonaws.cn/kinesisanalytics/latest/dev/images/window-tumbling-20.png)


例如，使用 `GROUP BY` 子句的聚合查询在一个滚动窗口中处理行。[入门练习](https://docs.amazonaws.cn/kinesisanalytics/latest/dev/get-started-exercise.html)中的演示流接收股票价格数据，而这些数据映射到应用程序中的应用程序内部流 `SOURCE_SQL_STREAM_001`。这个流具有以下架构。

```
(TICKER_SYMBOL VARCHAR(4), 
 SECTOR varchar(16), 
 CHANGE REAL, 
 PRICE REAL)
```

在您的应用程序代码中，假设您希望针对一分钟窗口找到每个股票行情机的聚合（最小、最大）价格。您可以使用以下查询。

```
SELECT STREAM ROWTIME,
              Ticker_Symbol,
              MIN(Price) AS Price,
              MAX(Price) AS Price
FROM     "SOURCE_SQL_STREAM_001"
GROUP BY Ticker_Symbol, 
         STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND);
```

上述示例是一个基于时间的窗口式查询。该查询根据 `ROWTIME` 值将记录分组。对于每分钟进行的报告，`STEP` 函数将 `ROWTIME` 值向下舍入到最接近的分钟。

**注意**  
您也可以使用 `FLOOR` 函数将记录分组为不同的窗口。但是，`FLOOR` 只能将时间值向下舍入到完整的时间单位（小时、分钟、秒等）。建议使用 `STEP` 以将记录分组为不同的滚动窗口，因为它可以将值向下舍入到任意间隔，例如，30 秒。

该查询是非重叠 (滚动) 窗口示例。`GROUP BY` 子句在一分钟窗口内对记录进行分组，每个记录属于一个特定窗口 (不重叠)。该查询每分钟发出一条输出记录，提供在特定时刻记录的 min/max 股票价格。在根据输入数据流生成周期性报告时，此类查询很有用。在本示例中，报告是每分钟生成的。

**测试查询**

1. 按照[入门练习](https://docs.amazonaws.cn/kinesisanalytics/latest/dev/get-started-exercise.html)设置应用程序。

1. 使用先前的 `SELECT` 查询替换应用程序代码中的 `SELECT` 语句。下面显示得到的应用程序代码：

   ```
   CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (
                                      ticker_symbol VARCHAR(4), 
                                      Min_Price     DOUBLE, 
                                      Max_Price     DOUBLE);
   -- CREATE OR REPLACE PUMP to insert into output
   CREATE OR REPLACE PUMP "STREAM_PUMP" AS 
     INSERT INTO "DESTINATION_SQL_STREAM" 
       SELECT STREAM Ticker_Symbol,
                     MIN(Price) AS Min_Price,
                     MAX(Price) AS Max_Price
       FROM    "SOURCE_SQL_STREAM_001"
       GROUP BY Ticker_Symbol, 
                STEP("SOURCE_SQL_STREAM_001".ROWTIME BY INTERVAL '60' SECOND);
   ```