Группировка нескольких строк в одну в Oracle SQL

#sql #oracle #aggregate #grouping

#sql #Oracle #агрегировать #группировка

Вопрос:

Как я могу заставить этот набор данных на изображении 1 выглядеть так, как данные на изображении 2. По сути, вместо того, чтобы размещать каждую покупку в отдельной строке, я хочу сгруппировать по имени и разместить все, что покупают люди, в одной строке. Они могут купить максимум 5 предметов, а моя база данных насчитывает около 30 миллионов строк покупок.

P.S Порядок дат не важен

Изображение 1

Изображение 2

Ответ №1:

Вы можете использовать row_number() и условную агрегацию:

 select name,
       max(case when seqnum = 1 then item end) as item_1,
       max(case when seqnum = 1 then date end) as date_1,
       max(case when seqnum = 2 then item end) as item_2,
       max(case when seqnum = 2 then date end) as date_2,
       max(case when seqnum = 3 then item end) as item_3,
       max(case when seqnum = 3 then date end) as date_3
from (select t.*,
             row_number() over (partition by name order by date asc) as seqnum
      from t
     ) t
group by name;
 

Ответ №2:

Вы можете использовать PIVOT со row_number следующим:

 Select * from 
   (select t.*,
           row_number() over (partition by name order by date_purchased) rn
      from your_table t
  ) PIVOT
(Max(item_purchased), max(date_purchased) For rn in (1,2,3));