2015-04-28 4 views
5

Вопрос о том, как разделить поле (например, строку CSV) на несколько строк, ответил: Split values over multiple rows.Разделение значений по нескольким строкам в RedShift

Однако этот вопрос относится к MSSQL, и ответы используют различные функции, для которых нет эквивалентов RedShift.

Для полноты картины, вот пример того, что я хотел бы сделать:

Текущие данные:

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

Необходимые данные:

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

Теперь я могу предположим, что для случая небольшого ограниченного числа элементов в поле CSV используется: split_part и объединение по всем возможным расположениям массивов, например:

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. 

Однако это, очевидно, очень неэффективно и не будет работать для более длинных списков.

Любые лучшие идеи о том, как это сделать?

EDIT:

Там же несколько аналогичный вопрос относительно умножения строк: splitting rows in Redshift. Однако я не вижу, как этот подход может быть применен здесь.

EDIT 2:

Возможный дубликат: Redshift. Convert comma delimited values into rows. Но ничего нового - ответ @Masashi Miyazaki похож на мое предложение выше и страдает от одних и тех же вопросов.

+0

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

+0

Пожалуйста, посмотрите жизнеспособный ответ на этот вопрос здесь. [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, это выглядит хорошо. Будете ли вы рассматривать его как ответ, чтобы я мог решить? – etov

ответ

1

Вот ответ Redshift, он будет работать с 10 тысячами значений в строке.

Настройка тестовых данных

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

код

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

Приглашаем вас принять экземпляр RDS PostgreSql и создать dblink для RedShift. Затем вы можете манипулировать по набору результатов, как в обычной базе данных PostgreSQL, и даже вернуть результат обратно в RedShift через тот же самый dblink.

+0

Типы массивов не поддерживаются красным смещением: http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-datatypes.html, поэтому это недействительный ответ ... – etov

+0

Был бы очень рад, однако это то, что я получаю: «[Amazon] (500310) Неверная операция: заданные типы или функции (по одному на сообщение INFO) не поддерживаются в таблицах Redshift ,; Предупреждения: Функция "string_to_array (текст, текст)" не поддерживается "(запрос: выберите string_to_array (csv_field, ',') из mytable;) – etov

+0

Версия кластера 1.0.901, и обновление версии разрешено ... Do у вас есть документация, связанная с этой функцией (например, в примечаниях к выпуску RedShift?) – etov

Смежные вопросы