#sql #oracle #aggregate #grouping
#sql #Oracle #агрегировать #группировка
Вопрос:
Как я могу заставить этот набор данных на изображении 1 выглядеть так, как данные на изображении 2. По сути, вместо того, чтобы размещать каждую покупку в отдельной строке, я хочу сгруппировать по имени и разместить все, что покупают люди, в одной строке. Они могут купить максимум 5 предметов, а моя база данных насчитывает около 30 миллионов строк покупок.
P.S Порядок дат не важен
Ответ №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));