#sql #amazon-redshift
Вопрос:
Я ищу простой способ транспонировать большой набор строк в столбцы без необходимости упоминать каждое отдельное значение строки в специальных CASE WHEN
операторах, учитывая, что количество различных значений, которые я хочу преобразовать в столбцы, безусловно, не мало.
Подводя итог, у меня есть таблица, похожая на приведенную ниже:
seller product
a 1
b 1
b 2
a 6
c 4
d 7
a 4
b 7
d 1
Моя цель состоит в том, чтобы получить одну колонку, представляющую каждого продавца, в которой будет храниться список товаров, доступных каждому из них. Следовательно, из приведенного примера результат, которого я пытаюсь достичь, будет выглядеть следующим образом:
a b c d
1 1 4 7
6 2 1
4 7
Ответ №1:
Вы можете использовать row_number()
для добавления порядкового номера, а затем агрегировать по нему:
select max(case when seller = 'a' then product end) as a,
max(case when seller = 'b' then product end) as b,
max(case when seller = 'c' then product end) as c,
max(case when seller = 'd' then product end) as d
from (select t.*,
row_number() over (partition by seller order by product) as seqnum
from t
) t
group by seqnum;
Примечание: Это заказы по продукту, поэтому результаты не совсем соответствуют порядку, указанному в вашем запросе. В таблице нет «исходного» порядка, поскольку таблицы SQL представляют собой неупорядоченные (мульти)наборы. Вы можете использовать другой столбец или выражение для order by
, если у вас предпочтительный порядок.
Комментарии:
1. На самом деле в наборе данных, с которым я работаю, количество различных продавцов достаточно велико, и я хотел бы найти способ избежать необходимости упоминать каждого из них в запросе. Возможно ли это?
2. @teogj . . . Я бы рекомендовал создать код в электронной таблице.