如何将聚合的数据“取消分组”到行?

问题描述 投票:0回答:2

我有一个具有类似架构的表:

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

我已经尝试了一些联合和案例陈述,但是没有任何努力可以给我期望的结果。

sql impala
2个回答
0
投票

解决它的方法是生成一个数字列表,然后将其加入:

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子查询。


0
投票

基本上,您需要一个序列号。如果您的桌子足够大(如您的情况),则可以直接使用它:

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构造一个。

© www.soinside.com 2019 - 2024. All rights reserved.