

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

# 列表分析规则
<a name="analysis-rules-list"></a>

在中 AWS Clean Rooms，*列表分析规则*输出行级列表，列出其添加到的已配置表与可以查询的成员的配置表之间的重叠部分。可以查询的成员运行包含列表分析规则的查询。

列表分析规则类型支持扩充和受众构建等使用案例。

有关此分析规则的预定义查询结构和语法的更多信息，请参阅[列表分析规则预定义结构](#intersection-list-params-template)。

列表分析规则的参数（在[列表分析规则 — 查询控制](#parameters-list-query-controls)中定义）具有查询控制。它的查询控制包括选择可以在输出中列出的列的功能。查询要求至少有一次与可以查询成员的配置表联接，可以是直接联接，也可以是传递联接。

不存在像[聚合分析规则](analysis-rules-aggregation.md)那样的查询结果控制。

列表查询只能使用数学运算符。它们不能使用其他函数（例如聚合或标量）。

**Topics**
+ [列表查询结构和语法](#list-query-controls)
+ [列表分析规则 — 查询控制](#parameters-list-query-controls)
+ [列表分析规则预定义结构](#intersection-list-params-template)
+ [列表分析规则 — 示例](#list-example)

## 列表查询结构和语法
<a name="list-query-controls"></a>

对具有列表分析规则的表的查询必须遵循以下语法。

```
--select_list_expression
SELECT DISTINCT column_name [[AS] column_alias ] [, ...] 

--table_expression
FROM table_name [[AS] table_alias ]
  [[INNER] JOIN table_name [[AS] table_alias] ON join_condition] [...]

--where_expression
[WHERE where_condition]          

--limit_expression
[LIMIT number]
```

下表解释前面语法中列出的每个表达式。


| Expression | 定义 | 示例 | 
| --- | --- | --- | 
| select\$1list\$1expression |  包含至少一个表列名的逗号分隔列表。 `DISTINCT` 参数是必需的。  `select_list_expression` 可以带或不带 `AS` 参数对列设置别名。 有关更多信息，请参阅 [AWS Clean Rooms SQL 参考](https://docs.aws.amazon.com/clean-rooms/latest/sql-reference/sql-reference.html)。   |  `SELECT DISTINCT segment`  | 
| table\$1expression |  使用 `join_condition` 连接到 `join_condition` 的表或表的联接。 `join_condition` 返回布尔值。 `table_expression` 支持： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/clean-rooms/latest/userguide/analysis-rules-list.html)  |  <pre>FROM consumer_table <br />INNER JOIN provider_table<br />ON<br />consumer_table.identifier1 = provider_table.identifier1<br />AND<br />consumer_table.identifier2 = provider_table.identifier2</pre>  | 
| where\$1expression | 返回布尔值的条件表达式。它可能包括以下内容：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/clean-rooms/latest/userguide/analysis-rules-list.html)支持的比较条件是 (`=, >, <, <=, >=, <>, !=, NOT, IN, NOT IN, LIKE, IS NULL, IS NOT NULL`)。支持的逻辑运算符是 (`AND, OR`)。`where_expression` 是可选项。 |  `WHERE state + '_' + city = 'NY_NYC'` `WHERE timestampColumn = timestampColumn2 - 14`   | 
| limit\$1expression |  此表达式必须采用正整数。 `limit_expression` 是可选项。  |  `LIMIT 100`  | 

关于列表查询的结构和语法，请注意以下几点：
+ 不支持除 SELECT 之外的 SQL 命令。
+ 不支持子查询和通用表格表达式（例如 WITH）。
+ 不支持 HAVING、GROUP BY 和 ORDER BY 子句
+ 不支持 OFFSET 参数

## 列表分析规则 — 查询控制
<a name="parameters-list-query-controls"></a>

使用列表查询控制，您可以控制如何使用表中的列来查询表。例如，您可以控制哪一列用于联接，或者 SELECT 语句和 WHERE 子句中可以使用哪一列。

下面几节解释每种控制。

**Topics**
+ [联接控制](#list-controls-join-controls)
+ [列表控制](#list-controls)

### 联接控制
<a name="list-controls-join-controls"></a>

使用*联接控制*，您可以控制如何将您的表连接到 **table\$1expression** 中的其他表。 AWS Clean Rooms 仅支持 INNER JOIN。在列表分析规则中，至少需要一个 INNER JOIN，并且可以查询的成员必须在 INNER JOIN 中包含自己拥有的表。这意味着他们必须直接或通过传递方式将您的表与他们的表联接起来。

以下是传递联接的示例。

```
ON 
my_table.identifer = third_party_table.identifier 
.... 
ON 
third_party_table.identifier = member_who_can_query_table.id
```

INNER JOIN 语句只能使用在分析规则中明确归类为 `joinColumn` 的列。

INNER JOIN 必须对您的已配置表中的 `joinColumn` 和协作中另一个已配置表中的 `joinColumn` 进行操作。您可以决定表中的哪些列可以用作 `joinColumn`。

ON 子句中的每个匹配条件都要求在两列之间使用相等比较条件 (`=`)。

ON 子句中的多个匹配条件可以是：
+ 使用 `AND` 逻辑运算符组合
+ 使用 `OR` 逻辑运算符分隔

**注意**  
所有 JOIN 匹配条件都必须与 JOIN 两侧各一条记录匹配。所有由 `OR` 或 `AND` 逻辑运算符连接的条件也必须遵守此要求。

以下是使用 `AND` 逻辑运算符的查询示例。

```
SELECT some_col, other_col 
FROM table1 
    JOIN table2 
    ON table1.id = table2.id AND table1.name = table2.name
```

以下是使用 `OR` 逻辑运算符的查询示例。

```
SELECT some_col, other_col 
FROM table1 
    JOIN table2 
    ON table1.id = table2.id OR table1.name = table2.name
```


| 控件 | 定义 | 用法 | 
| --- | --- | --- | 
| joinColumns | 您希望允许可以查询的成员在 INNER JOIN 语句中使用的列。 |  同一列不能同时归类为 `joinColumn` 和 `listColumn`（参阅[列表控制](#list-controls)）。 除了 INNER JOIN 之外，不能在查询的任何其他部分中使用 `joinColumn`。  | 

### 列表控制
<a name="list-controls"></a>

*列表控制*用于控制可在查询输出中列出（即在 SELECT 语句中使用）或用于筛选结果（即在 WHERE 语句中使用）的列。


| 控件 | 定义 | 用法 | 
| --- | --- | --- | 
| listColumns | 您允许可以查询的成员在 SELECT 和 WHERE 中使用的列。 | listColumn 可以在 SELECT 和 WHERE 中使用。同一列不能同时用作 `listColumn` 和 `joinColumn`。 | 

## 列表分析规则预定义结构
<a name="intersection-list-params-template"></a>

以下示例包括一个预定义的结构，该结构向您展示了如何完成列表分析规则。

在以下示例中，*`MyTable`* 指您的数据表。你可以用自己的信息替换每个*user input placeholder*信息。

```
{
  "joinColumns": [MyTable column name(s)],
  "listColumns": [MyTable column name(s)],
}
```

## 列表分析规则 — 示例
<a name="list-example"></a>

以下示例演示了两家公司如何合作 AWS Clean Rooms 使用列表分析。

A 公司有客户关系管理 (CRM) 数据。A 公司希望获得有关其客户的更多细分数据，以进一步了解他们的客户，并有可能使用属性作为其他分析的输入。B 公司的细分数据由他们根据第一方数据创建的独特细分属性组成。B 公司只想向 A 公司提供其数据与 A 公司数据重叠的客户的唯一细分属性。

两家公司决定进行协作，以便 A 公司能够扩充重叠的数据。A 公司是可以查询的成员，B 公司是贡献者。

为创建协作并在协作中运行列表分析，两家公司执行以下操作：

1. A 公司创建协作并创建成员身份。协作中的另一个成员是 B 公司。A 公司在协作中启用查询日志记录，并在其账户中启用查询日志记录。

1. B 公司在协作中创建成员身份。它在其账户中启用查询日志记录。

1. A 公司创建 CRM 配置表。

1. A 公司将分析规则添加到客户配置表中，如以下示例所示。

   ```
   {
     "joinColumns": [
       "identifier1",
       "identifier2"
     ],
     "listColumns": [
       "internalid",
       "segment1",
       "segment2",
       "customercategory"
     ]
   }
   ```

   `joinColumns`— A 公司希望使用 `hashedemail` and/or `thirdpartyid`（从身份供应商处获得）将 CRM 数据中的客户与来自细分市场的客户进行匹配。这将有助于确保 A 公司为合适的客户匹配扩充的数据。他们有两个 JoinColumns，可以提高分析的匹配率。

   `listColumns` — A 公司使用 `listColumns` 来获取他们在自己系统中使用的 `internalid` 旁边的扩充列。他们添加了 `segment1`、`segment2` 和 `customercategory`，以便通过在筛选器中使用它们，将扩充限制到特定的细分。

1. B 公司创建细分配置表。

1. B 公司将分析规则添加到细分配置表中。

   ```
   {
     "joinColumns": [
       "identifier2"
     ],
     "listColumns": [
       "segment3",
       "segment4"
     ]
   }
   ```

   `joinColumns`— B 公司让 A 公司在 `identifier2` 上进行联接，以便将细分数据中的客户与 CRM 数据相匹配。A 公司和 B 公司与身份供应商合作，以获得与此协作相匹配的 `identifier2`。他们之所以没有添加其他 `joinColumns`，是因为他们认为 `identifier2` 可以提供最高和最准确的匹配率，而且查询不需要其他标识符。

   `listColumns` — B 公司让 A 公司使用 `segment3` 和 `segment4` 属性来扩充其数据，这些属性是他们（与客户 A）一起创建、收集和调整的独特属性，是数据扩充的一部分。他们希望 A 公司在行级获取这些重叠的细分，因为这是一项数据扩充协作。

1. A 公司创建了与协作的 CRM 表关联。

1. B 公司创建了与协作的细分表关联。

1. A 公司运行查询（例如以下查询）以扩充重叠的客户数据。

   ```
   SELECT companyA.internalid, companyB.segment3, companyB.segment4
   INNER JOIN returns companyB
    ON companyA.identifier2 = companyB.identifier2
   WHERE companyA.customercategory > 'xxx'
   ```

1. A 公司和 B 公司查看查询日志。B 公司验证查询是否符合协作协议中上商定的内容。