Casi d'uso dei dati nidificati - Amazon Redshift

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Casi d'uso dei dati nidificati

Questo argomento descrive i casi d'uso per i dati annidati. I dati nidificati sono dati che contengono campi nidificati. I campi nidificati sono campi che vengono uniti come un'unica entità, come matrici, strutture o oggetti.

È possibile combinare le estensioni descritte in precedenza con le funzionalità usuali. SQL I casi d'uso seguenti presentano alcune combinazioni comuni. Questi esempi offrono una dimostrazione dell'utilizzo dei dati nidificati. Non fanno parte del tutorial.

Inserimento di dati nidificati

Puoi utilizzare l'istruzione CREATE TABLE AS per inserire dati da una tabella esterna contenente tipi di dati complessi. La query seguente estrae tutti i clienti e i relativi numeri di telefono dalla tabella esterna mediante LEFT JOIN e li archivia nella tabella CustomerPhones di Amazon Redshift.

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;

Aggregazione di dati nidificati con query secondarie

Puoi utilizzare una query secondaria per aggregare dati nidificati. Questo approccio viene descritto nell'esempio seguente.

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

Vengono restituiti i seguenti dati.

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

Quando aggreghi dati nidificati raggruppandoli in base alla riga padre, il modo più efficiente di procedere è quello illustrato nell'esempio precedente. Nell'esempio in questione, le righe nidificate di c.orders sono raggruppate in base alla riga padre c. In alternativa, se sai che l'id è univoco per ciascun customer e o.shipdate non è mai null, puoi eseguire l'aggregazione come illustrato nell'esempio seguente. Tuttavia, in genere questo approccio è meno efficiente rispetto a quello dell'esempio precedente.

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;

Puoi inoltre scrivere la query utilizzando una query secondaria nella clausola FROM che fa riferimento a un alias (c) della query con predecessore e che estrae i dati della matrice. L'esempio seguente mostra questo approccio.

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

Unione dei dati di Amazon Redshift e dei dati nidificati

È possibile unire i dati di Amazon Redshift e i dati nidificati in una tabella esterna. Ad esempio, si supponga di avere i seguenti dati nidificati in 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>> );

Si supponga inoltre di avere la seguente tabella in Amazon Redshift.

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

La query riportata di seguito restituisce il numero totale e l'importo degli acquisti di ciascun cliente sulla base di quanto indicato in precedenza. L'esempio seguente viene utilizzato soltanto a scopo illustrativo. Restituisce dati solo se hai creato le tabelle descritte in precedenza.

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;