

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

# Group Rank
<a name="sql-reference-group-rank-udx"></a>

此函数会将 `RANK()` 函数应用于行的逻辑组，并且（可选）按排序顺序传送该组。

`group_rank` 的应用包括：
+ 对流式处理 `GROUP BY` 的结果进行排序。
+ 确定组结果中的关系。

Group Rank 可以执行以下操作：
+ 将排名应用于指定的输入列。
+ 提供已排序或未排序的输出。
+ 允许用户指定数据刷新的非活动时间段。

## SQL 声明
<a name="sql-reference-group-rank-udx-declarations"></a>

函数属性和 DDL 将在后面的部分中介绍。
<a name="sql-reference-group-rank-udx-attributes"></a>
**的功能属性 Group\_Rank**  
此函数的作用如下：
+ 收集行，直至检测到行时间更改或超过指定的空闲时间限制。
+ 接受任何流式行集。
+ 使用包含基本 SQL 数据类型 `INTEGER`、`CHAR` 和 `VARCHAR` 的任何列作为排名依据。
+ 按收到的顺序或选定列中值的升序或降序对输出行进行排序。

### DDL for Group\_Rank
<a name="sql-reference-group-rank-udx-udl"></a>

```
  group_rank(c cursor, rankByColumnName VARCHAR(128),
    rankOutColumnName VARCHAR(128), sortOrder VARCHAR(10), outputOrder VARCHAR(10),
    maxIdle INTEGER, outputMax INTEGER)
  returns table(c.*, "groupRank" INTEGER)
```

下表中列出了该函数的参数。


| 参数 | 说明 | 
| --- | --- | 
| c | 指向流式结果集的光标 | 
| `rankByColumnName` | 命名要用于对组进行排名的列的字符串。 | 
| `rankOutColumnName` | 命名要用于返回排名的列的字符串。<br />此字符串必须与 `CREATE FUNCTION` 语句的 `RETURNS` 子句中 `groupRank` 列的名称匹配。 | 
| `sortOrder` | 控制行的排序以进行排名分配。<br />有效值如下所示：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/sql-reference-group-rank-udx.html) | 
| `outputOrder` | 控制输出的排序。有效值如下所示：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/sql-reference-group-rank-udx.html) | 
| `maxIdle` | 保留组以进行排名的时间限制（以毫秒为单位）。<br />当 `maxIdle` 过期时，当前组将会释放到流中。值为 0 表示没有空闲超时。 | 
| `outputMax` | 该函数将在给定组中输出的最大行数。<br />值为 0 表示没有限制。 | 

## 示例
<a name="sql-reference-group-rank-example"></a>

### 示例数据集
<a name="sql-reference-group-rank-example-dataset"></a>

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

在此示例中，聚合查询在 `ROWTIME` 上有一个 `GROUP BY` 子句，可将流分组到有限行中。然后，`GROUP_RANK` 函数对 `GROUP BY` 子句返回的行进行排序。

```
CREATE OR REPLACE STREAM "ticker_grouped" (
    "group_time" TIMESTAMP,
    "ticker" VARCHAR(65520),
    "ticker_count" INTEGER);

CREATE OR REPLACE STREAM "destination_sql_stream" (
    "group_time" TIMESTAMP,
    "ticker" VARCHAR(65520),
    "ticker_count" INTEGER,
    "group_rank" INTEGER);
    
CREATE OR REPLACE PUMP "ticker_pump" AS 
    INSERT INTO "ticker_grouped"
    SELECT STREAM
        FLOOR(SOURCE_SQL_STREAM_001.ROWTIME TO SECOND),
        "TICKER_SYMBOL",
        COUNT(TICKER_SYMBOL)
    FROM SOURCE_SQL_STREAM_001
    GROUP BY FLOOR(SOURCE_SQL_STREAM_001.ROWTIME TO SECOND), TICKER_SYMBOL;

CREATE OR REPLACE PUMP DESTINATION_SQL_STREAM_PUMP AS 
    INSERT INTO "destination_sql_stream"
    SELECT STREAM
        "group_time",
        "ticker",
        "ticker_count",
        "groupRank"
    FROM TABLE(
        GROUP_RANK(
            CURSOR(SELECT STREAM * FROM "ticker_grouped"), 
            'ticker_count', 
            'groupRank', 
            'desc', 
            'asc', 
            5, 
            0));
```

### 结果
<a name="sql-reference-group-rank-example-results"></a>

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

![该表显示了 ROWTIME、group_time、ticker、ticker_count 和 group_rank 列以及样本数据。](http://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/images/sql-reference-group-rank-example-01.png)


## 操作概述
<a name="sql-reference-group-rank-udx-ops"></a>

通过输入光标为每个组（即行时间相同的行）缓冲行。在行时间不同的行到达之后（或出现空闲超时之时）对行进行排名。继续读取行，同时对行时间相同的行组进行排名。

在分配排名后，`outputMax` 参数将指定要为每个组返回的最大行数。

默认情况下，`group_rank` 支持列传递，如示例中所示：使用 `c.*` 作为标准快捷方式以指示按显示的顺序传递所有输入列。您可以改为使用表示法“`c.columName`”指定一个子集，以便对列进行重新排序。但是，使用特定的列名称会将 UDX 绑定到一个特定的输入集，而使用 `c.*` 表示法可让 UDX 处理任何输入集。

`rankOutColumnName` 参数将指定要用于返回排名的输出列。此列名称必须与 `CREATE FUNCTION` 语句的 `RETURNS` 子句中指定的列名称匹配。