2015-04-28 14 views
5

La domanda su come suddividere un campo (ad esempio una stringa CSV) in più righe è già stata risolta: Split values over multiple rows.Dividi valori su più righe in RedShift

Tuttavia, questa domanda si riferisce a MSSQL e le risposte utilizzano varie funzionalità per le quali non esistono equivalenti di RedShift.

Per ragioni di completezza, ecco un esempio di quello che mi piacerebbe fare:

dati attuale:

| Key | Data  | 
+-----+----------+ 
| 1 | 18,20,22 | 
| 2 | 17,19 | 

dati richiesti:

| Key | Data  | 
+-----+----------+ 
| 1 | 18  | 
| 1 | 20  | 
| 1 | 22  | 
| 2 | 17  | 
| 2 | 19  | 

Ora, posso suggerisci una soluzione per il caso di un numero limitato di elementi nel campo CSV: usa split_part e union su tutte le possibili posizioni dell'array, ad esempio:

SELECT Key, split_part(Data, ',', 1) 
FROM mytable 
WHERE split_part(Data, ',', 1) != "" 
    UNION 
SELECT Key, split_part(Data, ',', 2) 
FROM mytable 
WHERE split_part(Data, ',', 2) != "" 
-- etc. etc. 

Tuttavia, questo è ovviamente molto inefficiente e non funzionerebbe per elenchi più lunghi.

Qualche idea migliore su come farlo?

EDIT:

C'è anche una domanda in qualche modo simile per quanto riguarda le righe si moltiplicano: splitting rows in Redshift. Tuttavia, non vedo come questo approccio possa essere applicato qui.

EDIT 2:

Una possibile duplicato: Redshift. Convert comma delimited values into rows. Ma niente di nuovo - la risposta di @Masashi Miyazaki è simile al mio suggerimento sopra, e soffre degli stessi problemi.

+0

Vedi http://stackoverflow.com/questions/25112389/redshift-convert-comma-delimited-values-into-rows/31998832 # 31998832 –

+0

Si prega di vedere una risposta valida per questa domanda qui. [https://stackoverflow.com/questions/46784721/redshift-split-single-dynamic-column-into-multiple-rows-in-new-table/46785509#46785509](https://stackoverflow.com/questions/ 46784721/redshift-split-single-dynamic-column-in-multiple-rows-in-new-table/46785509 # 46785509) –

+0

@JonScott, questo sembra buono. Lo inquadrerai come risposta in modo che io possa risolvere? – etov

risposta

1

Ecco la risposta di Redshift, funzionerà con un massimo di 10 mila valori per riga.

impostare i dati di test

create table test_data (key varchar(50),data varchar(max)); 
insert into test_data 
    values 
     (1,'18,20,22'), 
     (2,'17,19') 
; 

codice

with ten_numbers as (select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0) 
    , generted_numbers AS 
(
    SELECT (1000 * t1.num) + (100 * t2.num) + (10 * t3.num) + t4.num AS gen_num 
    FROM ten_numbers AS t1 
     JOIN ten_numbers AS t2 ON 1 = 1 
     JOIN ten_numbers AS t3 ON 1 = 1 
     JOIN ten_numbers AS t4 ON 1 = 1 
) 
    , splitter AS 
(
    SELECT * 
    FROM generted_numbers 
    WHERE gen_num BETWEEN 1 AND (SELECT max(REGEXP_COUNT(data, '\\,') + 1) 
           FROM test_data) 
) 
    , expanded_input AS 
(
    SELECT 
     key, 
     split_part(data, ',', s.gen_num) AS data 
    FROM test_data AS td 
     JOIN splitter AS s ON 1 = 1 
    WHERE split_part(data, ',', s.gen_num) <> '' 
) 
SELECT * FROM expanded_input 
order by key,data; 
-2

Ti invitiamo a prendere l'istanza di RDS PostgreSql e creare il link per RedShift. Quindi puoi manipolare il set di risultati come nel normale DB PostgreSQL e persino riportare i risultati in RedShift tramite lo stesso dblink.

+0

I tipi di array non sono supportati da redshift: http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-datatypes.html, quindi questa non è una risposta valida ... – etov

+0

Sarebbe stato estremamente felice, tuttavia questo è quello che ottengo: "[Amazon] (500310) Operazione non valida: tipi o funzioni specificati (uno per messaggio INFO) non supportati sulle tabelle Redshift .; Avvisi: Funzione "string_to_array (testo, testo)" non supportato "(query: selezionare string_to_array (csv_field, ',') da mytable;) – etov

+0

La versione cluster è 1.0.901 e l'aggiornamento della versione è consentito ... Do avete qualche documentazione relativa a questa funzione (ad es. nelle note di rilascio di RedShift?) – etov