Вопрос о том, как разделить поле (например, строку 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 похож на мое предложение выше и страдает от одних и тех же вопросов.
См http://stackoverflow.com/questions/25112389/redshift-convert-comma-delimited-values-into-rows/31998832 # 31998832 –
Пожалуйста, посмотрите жизнеспособный ответ на этот вопрос здесь. [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) –
@JonScott, это выглядит хорошо. Будете ли вы рассматривать его как ответ, чтобы я мог решить? – etov