Извлечение строки и преобразование столбцов в строки в SQL (Redshift) - PullRequest
0 голосов
/ 07 июня 2018

У меня есть столбец под названием «Описание» в таблице под названием «Еда», который включает в себя несколько названий продуктов, разделенных, например, курица, суп, хлеб, кокс

КакМогу ли я извлечь каждый элемент из столбца и создать несколько строк.Например, в настоящее время это похоже на {FoodID, FoodName, Description} ==> {123, еда, " курица, суп, хлеб, кокс "}

и мне нужно

{FoodID, FoodName, Description} ==> {123, еда, курица }, {123, еда, суп }, {123, еда, хлеб } и т. Д.

В Redshift я сначала сделал разделение столбца «описание», так как

select FoodID, FoodName, Description, 
SPLIT_PART(Description, ',',1) AS Item1, 
SPLIT_PART(Description, ',',1) AS Item2,
SPLIT_PART(Description, ',',1) AS Item3,.....till Item10
FROM Food

считает, что может быть максимум 10 элементов и, следовательно, Item10.Какой лучший способ преобразовать эти столбцы Item1 в Item10 для хранения в виде строк?Я попробовал UNION ALL, но это занимает больше времени, учитывая огромную загрузку данных.

1 Ответ

0 голосов
/ 07 июня 2018

Ваш вопрос ответил здесь подробно специально для Redshift.Вам просто нужно сопоставить ваши запросы с примерами запросов, предоставленных там.Ваш запрос будет выглядеть примерно так:

select  (row_number() over (order by true))::int as n into numbers from food limit 100;

Это создаст таблицу чисел.

Ваш запрос станет:

select  foodId,   foodName,   split_part(Description,',',n) as descriptions from  food  cross join  numbers where  split_part(Description,',',n) is not null  and split_part(Description,',',n) != '';

Теперь вернемся к вашемуОригинальный вопрос о производительности.

Это занимает больше времени, учитывая огромную нагрузку данных.

Учитывая типичный вариант использования хранилища данных high read и seldom write, вывы должны хранить ваши типичные данные о еде, которые вы упомянули в таблице stagging, скажем stg_food.

. Вы должны использовать следующий тип запроса, чтобы выполнить однократную вставку в фактическую таблицу food, как показано ниже.

insert into  food  select  foodId,  foodName,  split_part(Description,',',n) as descriptions from  stg_food  cross join  numbers where   split_part(Description,',',n) is not null  and split_part(Description,',',n) != '';

Это запишет один раз и ускорит ваши запросы выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...