您可以取消嵌套字符串,然后应用一些聚合逻辑:
with t as (
select 'A >> B >> C' as items union all
select 'A >> A >> B' as items union all
select 'B >> B >> C >> C >> A' as items union all
select 'B >> B >> B >> C >> A >> D' as items
)
select t.*,
(select as struct max(case when n = 1 then item end) as item_1,
max(case when n = 1 then cnt end) as item_1_cnt,
max(case when n = 2 then item end) as item_2,
max(case when n = 2 then cnt end) as item_2_cnt,
max(case when n = 3 then item end) as item_3,
max(case when n = 3 then cnt end) as item_3_cnt
from (select item, dense_rank() over (order by min(n)) as n, count(*) as cnt
from unnest(split(t.items, ' >> ')) item with offset n
group by item
) x
).*
from t;
最里面的子查询使用计数器将字符串转换为行。然后将其汇总起来,以便在商品首次出现时对商品进行排序-以及商品的数量。
最后,这些汇总到所需的不同列中。