

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

# 中的自定义分析规则 AWS Clean Rooms
<a name="analysis-rules-custom"></a>

在中 AWS Clean Rooms，*自定义分析规则*是一种新的分析规则，允许在配置的表上运行自定义查询。自定义 SQL 查询仍然仅限于只有 SELECT 命令，但与[聚合](analysis-rules-aggregation.md#agg-query-controls)和[列表](analysis-rules-list.md#list-query-controls)查询相比，可以使用更多的 SQL 构造（例如，窗口函数、OUTER JOIN、CTE 或子查询；有关完整列表，请参阅 [AWS Clean Rooms SQL 参考](https://docs.aws.amazon.com/clean-rooms/latest/sql-reference/sql-reference.html)）。自定义 SQL 查询不必遵循[聚合](analysis-rules-aggregation.md#agg-query-structure-syntax)和[列表](analysis-rules-list.md#list-query-controls)查询之类的查询结构。

与聚合和列表分析规则支持的使用案例相比，自定义分析规则支持更高级的使用案例，例如自定义归因分析、基准测试、增量分析和受众发现。这是对聚合和列表分析规则支持的使用案例的超集的补充。

自定义分析规则还支持差别隐私。差别隐私是一种在数学上非常严格的数据隐私保护框架。有关更多信息，请参阅 [AWS Clean Rooms 差异隐私](differential-privacy.md)。创建分析模板时， AWS Clean Rooms 差分隐私会检查该模板以确定其是否与 AWS Clean Rooms 差分隐私的通用查询结构兼容。此验证可确保您不会创建对于差别隐私保护表不允许的分析模板。

要配置自定义分析规则，数据所有者可以选择允许存储在[分析模板](create-analysis-template.md)中的特定自定义查询在其配置表上运行。数据所有者在将分析模板添加到自定义分析规则中允许的分析控制之前应先审核这些模板。分析模板仅在创建这些模板的协作中可用和可见（即使该表与其他协作关联），并且只能由可以在该协作中进行查询的成员运行。

或者，成员可以选择允许其他成员（查询提供者）无需审核即可创建查询。成员在自定义分析规则添加允许的查询提供者控制的查询提供者账户。如果查询提供者是可以查询的成员，则他们可以直接在配置表上运行任何查询。查询提供者还可以通过创建[分析模板](create-analysis-template.md)来创建查询。在存在查询提供商且与表关联的所有协作中，查询提供者创建的任何查询 AWS 账户 都将自动允许在表上运行。

本页包含以下部分：
+ [自定义分析规则结构 ](#custom-predefined-structure)
+ [带有分析模板的自定义分析规则示例 ](#custom-example)
+ [具有最低聚合阈值的自定义分析规则示例 ](#custom-example-min-agg)
+ [包含最低聚合阈值和比较控制的自定义分析规则示例 ](#custom-example-min-agg-comparison)
+ [把所有东西放在一起 ](#custom-complete-example)

自定义分析规则支持以下隐私增强控件：
+ [允许的分析 ](custom-allowed-analyses.md)
+ [不允许的输出列 ](disallowed-output-columns.md)
+ [最低聚合阈值 ](custom-min-agg-thresholds.md)
+ [比较控件 ](custom-comparison-controls.md)
+ [具有差异隐私的自定义分析规则 ](custom-diff-privacy.md)
+ [注意事项和限制](custom-considerations.md)
+ [用于最低限度聚合和比较控制的 SQL 功能 ](custom-sql-capabilities.md)

## 自定义分析规则结构
<a name="custom-predefined-structure"></a>

以下预定义结构显示了自定义分析规则中的可用控件。仅包含用例所需的控件。`differentialPrivacy`控件中的`userIdentifier`值是唯一标识用户的列，例如 * user\_id *。当您在协作中开启了两个或更多具有差异隐私的表时， AWS Clean Rooms 需要您在两个分析规则中配置与用户标识符列相同的列。这样可以保持表中用户的统一定义。

```
{
  "allowedAnalyses": ["ANY_QUERY"] | string[],
  "allowedAnalysisProviders": [],
  "disallowedOutputColumns": [],
  "aggregationThresholds": [
    {
      "identityColumns": [],
      "minimumIdentityCount": number,
      "type": "COUNT_DISTINCT",
      "allowedAggregateExpressionType": "COLUMNS_ONLY" | "ANY_EXPRESSION",
      "outputColumnThresholds": [
        {
          "outputColumnName": string,
          "minimumIdentityCount": number
        }
      ]
    }
  ],
  "comparisonControls": {
    "allowedLiteralComparisonColumns": [],
    "allowedColumnComparisonColumns": []
  },
  "differentialPrivacy": {
    "columns": [
      {
        "name": "{{userIdentifier}}"
      }
    ]
  }
}
```

您可以：
+ 将分析模板 ARN 添加到允许的分析控制。在这种情况下，不包括 `allowedAnalysisProviders` 控制。

  ```
  {
    allowedAnalyses: string[]
  }
  ```
+ 向`allowedAnalysisProviders`控件添加成员 AWS 账户 ID。在这种情况下，您可以将 `ANY_QUERY` 添加到 `allowedAnalyses` 控制。

  ```
  {
    allowedAnalyses: ["ANY_QUERY"],
    allowedAnalysisProviders: string[]
  }
  ```

您还可以配置以下任何控件：
+ 不允许在查询结果中投影的列。有关更多信息，请参阅 [不允许的输出列](disallowed-output-columns.md)。

  ```
  {
    disallowedOutputColumns: string[]
  }
  ```
+ 最低聚合阈值，要求每个结果行至少表示最小数量的不同数据主体。您可以通过覆盖单个输出列的阈值`outputColumnThresholds`，并`allowedAggregateExpressionType`控制是否允许在聚合函数内使用表达式。有关更多信息，请参阅 [最低聚合阈值](custom-min-agg-thresholds.md)、[覆盖特定输出列的最小聚合阈值](custom-min-agg-thresholds.md#custom-min-agg-output-override) 和 [允许在聚合函数中嵌套表达式](custom-min-agg-thresholds.md#custom-min-agg-nested-expressions)。

  ```
  {
    aggregationThresholds: [
      {
        identityColumns: string[],
        minimumIdentityCount: number,
        type: "COUNT_DISTINCT",
        allowedAggregateExpressionType: "COLUMNS_ONLY" | "ANY_EXPRESSION",
        outputColumnThresholds: [
          {
            outputColumnName: string,
            minimumIdentityCount: number
          }
        ]
      }
    ]
  }
  ```
+ 比较控件定义哪些列可以与文字值进行比较，哪些可以与另一列进行比较。有关更多信息，请参阅 [比较控件](custom-comparison-controls.md)。

  ```
  {
    comparisonControls: {
      allowedLiteralComparisonColumns: string[],
      allowedColumnComparisonColumns: string[]
    }
  }
  ```
+ 一种差异的隐私配置，通过识别用户标识符列来保护表格。有关更多信息，请参阅[AWS Clean Rooms 差分隐私](differential-privacy.md#dp-overview)。

  ```
  {
    differentialPrivacy: {
      columns: [
        {
          name: string
        }
      ]
    }
  }
  ```

建议配置最低聚合阈值和比较控制。阈值本身仍然使低基数列或准识别列具有可比性，这可能会以意想不到的方式缩小结果范围。

当您的表包含低基数列或准识别列（例如邮政编码或年龄段）或者查询运行器不完全信任时，比较控件值得配置。有关显示两个控件一起配置的有效示例，请参阅[包含最低聚合阈值和比较控制的自定义分析规则示例](#custom-example-min-agg-comparison)。

## 带有分析模板的自定义分析规则示例
<a name="custom-example"></a>

以下示例演示了两家公司如何协作 AWS Clean Rooms 使用自定义分析规则。

A 公司有客户和销售数据。A 公司有兴趣了解 B 公司网站上广告活动的销售增量。B 公司拥有对 A 公司有用的观众数据和细分属性（例如，他们观看广告时使用的设备）。

A 公司想在协作中运行一个特定的增量查询。

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

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

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

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

1. A 公司向销售配置表添加空的自定义分析规则。

1. A 公司将销售配置表与协作关联起来。

1. B 公司创建观众配置表。

1. B 公司在观众配置表中添加一个空的自定义分析规则。

1. B 公司将观众配置表与协作关联起来。

1. A 公司查看与协作关联的销售表和观众表，并创建分析模板，为活动月份添加增量查询和参数。

   ```
   {
       "analysisParameters": [
       {
           "defaultValue": ""
           "type": "DATE"
           "name": "campaign_month"
       }
       ],
       "description": "Monthly incrementality query using sales and viewership data"
       "format": "SQL"
       "name": "Incrementality analysis"
       "source": 
           "WITH labeleddata AS
           (
           SELECT hashedemail, deviceid, purchases, unitprice, purchasedate,
           CASE
               WHEN testvalue IN ('value1', 'value2', 'value3') THEN 0
               ELSE 1
           END AS testgroup
           FROM viewershipdata
           )
           SELECT labeleddata.purchases, provider.impressions
           FROM labeleddata 
           INNER JOIN salesdata
             ON labeleddata.hashedemail = provider.hashedemail
           WHERE MONTH(labeleddata.purchasedate) > :campaignmonth
           AND testgroup = :group
          "
   }
   ```

1. A 公司将其账户（例如 444455556666）添加到自定义分析规则允许的分析提供者控制中。他们之所以使用允许的分析提供者控制，是因为他们希望允许在销售配置表上运行他们创建的任何查询。

   ```
   {
     "allowedAnalyses": [
       "ANY_QUERY"
     ],
     "allowedAnalysisProviders": [
       "444455556666"
     ]
   }
   ```

1. B 公司在协作中看到创建的分析模板并查看其内容，包括查询字符串和参数。

1. B 公司确定分析模板实现了增量使用案例，并满足如何查询其观众配置表的隐私要求。

1. B 公司将分析模板 ARN 添加到观众表的自定义分析规则允许的分析控制中。他们之所以使用允许的分析控制，是因为他们只想允许在观众配置表上运行增量查询。

   ```
   {
     "allowedAnalyses": [
       "arn:aws:cleanrooms:us-east-1:111122223333:membership/41327cc4-bbf0-43f1-b70c-a160dddceb08/analysistemplate/1ff1bf9d-781c-418d-a6ac-2b80c09d6292"
     ]
   }
   ```

1. A 公司运行分析模板并使用参数值 `05-01-2023`。

## 具有最低聚合阈值的自定义分析规则示例
<a name="custom-example-min-agg"></a>

以下示例演示了两家公司如何协作 AWS Clean Rooms 使用具有最低聚合阈值的自定义分析规则，而不是审查单个分析模板。

A 公司是一家出版商，其`impressions`表格包含`user_id``campaign_id`、和`event_date`。B公司是一家广告商，想要衡量广告活动的覆盖面，即看到给定活动的不同用户的数量。A公司希望确保任何查询结果都无法显示个人或小组，因此它使用最低聚合阈值，而不是审查单个分析模板。

要创建协作并进行自定义分析，两家公司将执行以下操作：

1. 公司 A 以另一个成员和可以查询的成员的身份 B 创建协作。公司 A 允许在协作及其账户中记录查询。

1. 公司 B 在协作中创建成员资格，并在其账户中启用查询登录。

1. 公司 A 创建了一个`impressions`配置表。

1. 公司 A 向`impressions`配置的表中添加了具有最低聚合阈值的自定义分析规则，这样返回的每行都代表至少 100 个不同的用户。公司 A 设置`user_id`为标识列，并将敏感度较低的`campaign_id`输出列的阈值改写为 5。A公司还允许对之进行字面比较`campaign_id`，`event_date`这样B公司就可以将查询范围限定为一个活动和一个日期范围。在字面比较中出现的每列都必须在许可列表中。最后，A公司将B公司的账户添加到允许的分析提供商控制范围内，这样B公司就可以在不按模板进行审查的情况下运行查询。

   ```
   {
     "aggregationThresholds": [
       {
         "identityColumns": [
           "user_id"
         ],
         "minimumIdentityCount": 100,
         "type": "COUNT_DISTINCT",
         "allowedAggregateExpressionType": "COLUMNS_ONLY",
         "outputColumnThresholds": [
           {
             "outputColumnName": "campaign_id",
             "minimumIdentityCount": 5
           }
         ]
       }
     ],
     "comparisonControls": {
       "allowedLiteralComparisonColumns": [
         "campaign_id",
         "event_date"
       ]
     },
     "allowedAnalyses": [
       "ANY_QUERY"
     ],
     "allowedAnalysisProviders": [
       "444455556666"
     ]
   }
   ```

1. 公司 A 将`impressions`配置的表与协作相关联。

1. B 公司运行覆盖率查询，按广告活动分组`event_date`并过滤：

   ```
   SELECT event_date, COUNT(DISTINCT user_id) AS reach
   FROM impressions
   WHERE event_date >= '2026-01-01' AND campaign_id = 'Holiday Promotion'
   GROUP BY event_date;
   ```

1. AWS Clean Rooms 仅返回由至少 100 个不同用户支持的行并抑制其余行，因此 B 公司无需了解任何个人或小群体的情况，即可了解假日促销活动的每日覆盖率。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/clean-rooms/latest/userguide/analysis-rules-custom.html)

   该日期`2026-01-03`未出现在结果中，因为当天看过该活动的不同用户不足 100 人，因此该行 AWS Clean Rooms 被屏蔽了。

与分析模板方法的主要区别在于，A公司从未审查过特定的查询。相反，公司 A 依靠阈值来限制任何查询可以返回的内容。有关更多信息，请参阅[最低聚合阈值](custom-min-agg-thresholds.md)和[比较控件](custom-comparison-controls.md)。

## 包含最低聚合阈值和比较控制的自定义分析规则示例
<a name="custom-example-min-agg-comparison"></a>

建议的基准配置是配置最低聚合阈值和比较控制。仅使用阈值即可确保每个结果行代表最少数量的不同数据主体，但它不能阻止对低基数列或准识别列进行比较。如果没有比较控件，查询运行器仍然可以对这些列进行筛选或联接，这可能会以意想不到的方式缩小结果范围。

当您的表包含低基数列或准识别列（例如邮政编码或年龄段）或者查询运行器不完全信任时，比较控件值得配置。添加比较控件限制了哪些列可以出现在字面比较和列对比中，从而缩小了仅有阈值就存在的差距。

以下配置组合了这两个控件：

```
{
  "aggregationThresholds": [
    {
      "identityColumns": [
        "user_id"
      ],
      "minimumIdentityCount": 100,
      "type": "COUNT_DISTINCT",
      "allowedAggregateExpressionType": "COLUMNS_ONLY"
    }
  ],
  "comparisonControls": {
    "allowedLiteralComparisonColumns": [
      "campaign_id"
    ],
    "allowedColumnComparisonColumns": [
      "user_id"
    ]
  },
  "allowedAnalyses": [
    "ANY_QUERY"
  ],
  "allowedAnalysisProviders": [
    "444455556666"
  ]
}
```

使用此配置，每个结果行代表至少 100 个不同的数据主体。查询运行器可以使用文字比较进行过滤，并`campaign_id`使用列与列的比较进行`user_id`联接。由于已设置比较许可名单，因此任何未列出的列（包括邮政编码或年龄段等低基数列）根本不能用于比较。

有关每个控件的更多信息，请参阅[最低聚合阈值](custom-min-agg-thresholds.md)和[比较控件](custom-comparison-controls.md)。有关还包括不允许的输出列的更完整配置，请参见[组合起来](#custom-complete-example)。

## 组合起来
<a name="custom-complete-example"></a>

以下示例使用不允许的输出列、最小聚合阈值和比较控件显示了自定义分析规则类型的完整配置。此配置强制至少聚合 100 个不同的数据主体，`user_id`防止在查询结果中投影，并允许查询运行者分析加入该`user_id`列的客户的交叉点。

此策略还允许对低敏感度列进行字面比较筛选，从而提供了更大的灵活性`price`，`status`并将该列的最小聚合阈值改写为 5：`campaign_id`

```
{
  "disallowedOutputColumns": [
    "user_id"
  ],
  "comparisonControls": {
    "allowedLiteralComparisonColumns": [
      "status",
      "price"
    ],
    "allowedColumnComparisonColumns": [
      "user_id"
    ]
  },
  "aggregationThresholds": [
    {
      "identityColumns": [
        "user_id"
      ],
      "minimumIdentityCount": 100,
      "type": "COUNT_DISTINCT",
      "allowedAggregateExpressionType": "COLUMNS_ONLY",
      "outputColumnThresholds": [
        {
          "outputColumnName": "campaign_id",
          "minimumIdentityCount": 5
        }
      ]
    }
  ],
  "allowedAnalyses": [
    "ANY_QUERY"
  ],
  "allowedAnalysisProviders": [
    "444455556666",
    "333366669999"
  ]
}
```