

经过仔细考虑，我们决定停用适用于 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)。

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

# 流数据操作：流联接
<a name="stream-joins-concepts"></a>

您可以在应用程序中拥有多个应用程序内部流。您可以编写 `JOIN` 查询关联到达这些流的数据。例如，假设您拥有以下应用程序内部流：
+ **OrderStream**— 接收正在下达的股票订单。

  ```
  (orderId SqlType, ticker SqlType, amount SqlType, ROWTIME TimeStamp)
  ```
+ **TradeStream**— 接收这些订单的股票交易结果。

  ```
  (tradeId SqlType, orderId SqlType, ticker SqlType, amount SqlType, ticker SqlType, amount SqlType, ROWTIME TimeStamp)
  ```

以下 `JOIN` 查询示例与这些流上的数据相关联。

## 示例 1：报告所提交订单在 1 分钟内有成交记录的订单
<a name="join-ex1"></a>

在此示例中，查询联接了 `OrderStream` 和 `TradeStream`。但是，由于我们只需要在下订单后 1 分钟内产生的交易，因此查询针对 `TradeStream` 定义 1 分钟的窗口。有关窗口式查询的信息，请参阅[滑动窗口](sliding-window-concepts.md)。

```
SELECT STREAM
     ROWTIME, 
     o.orderId, o.ticker, o.amount AS orderAmount,
     t.amount AS tradeAmount
FROM OrderStream AS o
JOIN TradeStream OVER (RANGE INTERVAL '1' MINUTE PRECEDING) AS t
ON   o.orderId = t.orderId;
```

您可以按如下所示使用 `WINDOW` 子句并编写前述查询来明确定义窗口：

```
SELECT STREAM
    ROWTIME, 
    o.orderId, o.ticker, o.amount AS orderAmount,
    t.amount AS tradeAmount
FROM OrderStream AS o
JOIN TradeStream OVER t
ON o.orderId = t.orderId
WINDOW t AS
    (RANGE INTERVAL '1' MINUTE PRECEDING)
```

当您将此查询包含在您的应用程序代码中时，应用程序代码将连续运行。对于 `OrderStream` 上到达的各个记录，如果在下订单后的 1 分钟窗口内存在交易，则应用程序发送输出。

前述查询中的联接是内部联接，对于 `TradeStream` 中存在匹配记录的 `OrderStream`，该查询会在其中发出记录（反之亦然）。使用外部连接可以创建另一个有趣场景。假设您需要查询在提交股票订单的 1 分钟内没有交易的订单，以及在同一窗口内为其他一些订单报告交易。这是*外部联接* 示例。

```
SELECT STREAM
    ROWTIME, 
    o.orderId, o.ticker, o.amount AS orderAmount,
    t.ticker, t.tradeId, t.amount AS tradeAmount,
FROM OrderStream AS o
LEFT OUTER JOIN TradeStream OVER (RANGE INTERVAL '1' MINUTE PRECEDING) AS t
ON    o.orderId = t.orderId;
```