Преобразование нескольких строк в столбцы с помощью красного смещения

#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 . . . Я бы рекомендовал создать код в электронной таблице.