嵌套数据使用案例 - Amazon Redshift

嵌套数据使用案例

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

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

提取嵌套数据

您可以使用 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;

使用子查询聚合嵌套数据

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

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 和嵌套数据

您还可以在外部表中联接 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;