

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 嵌套数据使用案例
<a name="nested-data-use-cases"></a>

本主题介绍嵌套数据的用例。嵌套数据是包含嵌套字段的数据。嵌套字段是指联接在一起作为单个实体的字段，例如数组、结构或对象。

您可以使用常用的 SQL 功能组合前面介绍的扩展。下面的使用案例阐述了一些常见的组合。这些示例帮助演示如何使用嵌套数据。它们不是本教程的组成部分。

**Topics**
+ [提取嵌套数据](#ingesting-nested-data)
+ [使用子查询聚合嵌套数据](#aggregating-with-subquery)
+ [联接 Amazon Redshift 和嵌套数据](#joining-redshift-data)

## 提取嵌套数据
<a name="ingesting-nested-data"></a>

您可以使用 `CREATE TABLE AS` 语句从包含复杂数据类型的外部表中提取数据。以下查询使用 `LEFT JOIN` 从外部表中提取所有客户及其电话号码，并将它们存储在 Amazon Redshift 表 `CustomerPhones` 中。

```
CREATE TABLE CustomerPhones AS
SELECT  c.name.given, c.name.family, p AS phone
FROM    spectrum.customers c LEFT JOIN c.phones p ON true;
```

## 使用子查询聚合嵌套数据
<a name="aggregating-with-subquery"></a>

您可以使用子查询聚合嵌套数据。以下示例说明了此方法。

```
SELECT c.name.given, c.name.family, (SELECT COUNT(*) FROM c.orders o) AS ordercount 
FROM   spectrum.customers c;
```

将返回以下数据。

```
given   |  family  |  ordercount
--------|----------|--------------
 Jenny  |  Doe     |       0
 John   |  Smith   |       2
 Andy   |  Jones   |       1
 (3 rows)
```

**注意**  
当您通过按父行进行分组来聚合嵌套数据时，最高效的方法是前面示例中所示的方法。在该示例中，`c.orders` 的嵌套行按其父行 `c` 分组。或者，如果您知道 `id` 对于每个 `customer` 是唯一的且 `o.shipdate` 从不为 Null，则您可以按下例中所示进行聚合。但一般而言，这种方法的效率比不上前面的示例。

```
SELECT    c.name.given, c.name.family, COUNT(o.shipdate) AS ordercount 
FROM      spectrum.customers c LEFT JOIN c.orders o ON true 
GROUP BY  c.id, c.name.given, c.name.family;
```

您也可以在 `FROM` 子句中使用一个子查询来编写查询，此子查询引用原级查询的别名 (`c`) 并提取数组数据。以下示例演示了此方法。

```
SELECT c.name.given, c.name.family, s.count AS ordercount
FROM   spectrum.customers c, (SELECT count(*) AS count FROM c.orders o) s;
```

## 联接 Amazon Redshift 和嵌套数据
<a name="joining-redshift-data"></a>

您还可以在外部表中联接 Amazon Redshift 数据以及嵌套数据。例如，假设您在 Amazon S3 中具有以下嵌套数据。

```
CREATE EXTERNAL TABLE spectrum.customers2 (
  id      int,
  name    struct<given:varchar(20), family:varchar(20)>,
  phones  array<varchar(20)>,
  orders  array<struct<shipdate:timestamp, item:int>>
);
```

此外，假设您在 Amazon Redshift 中具有下面的表。

```
CREATE TABLE prices (
  id int,
  price double precision
);
```

以下查询根据前面的内容查找每个客户的采购总数和购买金额。下例仅用于举例说明。仅当您创建了前面介绍的表时，它才返回数据。

```
SELECT   c.name.given, c.name.family, COUNT(o.date) AS ordercount, SUM(p.price) AS ordersum 
FROM     spectrum.customers2 c, c.orders o, prices p ON o.item = p.id  
GROUP BY c.id, c.name.given, c.name.family;
```