Как «разгруппировать» агрегированные данные в строки? - PullRequest
1 голос
/ 30 октября 2019

У меня есть таблица с похожей схемой:

basket_id | product | volume
101       | apple   | 3
102       | apple   | 2
102       | orange  | 2

Я пытаюсь «разгруппировать» или «дезагрегировать» таблицу следующим образом.

Желаемый вывод:

basket_id | product | volume
101       | apple   | 1
101       | apple   | 1
101       | apple   | 1
102       | apple   | 1
102       | apple   | 1
102       | orange  | 1
102       | orange  | 1

Я пробовал несколько союзов и дел, но ни один из них не дает мне желаемого результата без особых усилий.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

В основном вам нужен порядковый номер. Если ваша таблица достаточно велика (как в вашем случае), вы можете использовать ее напрямую:

with n as (
      select row_number() over (order by basket_id) as n
      from t
     ) t
select t.basket_id, t.product, 1 as volume
from t join
     n
     on n.n <= t.volume;

Если таблица недостаточно велика, у вас может быть таблица чисел или таблица большего размера. В противном случае вы можете создать его с помощью join s.

0 голосов
/ 30 октября 2019

Чтобы решить эту проблему, нужно сгенерировать список чисел и затем присоединить его:

select basket_id, product, 1
from mytable t
inner join (
    select 1 n union all select 2 union all select 3
) x on t.volume <= x.n

При необходимости вы можете расширить подзапрос unioned, добавив больше чисел.

...