多层次结构上的sql数组聚合

zzwlnbp8  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(314)

考虑以下相当标准的非规范化事务信息模型:

with transactions as(
  select 'T_10000' as trans_id, 'L_1000' as line_item_id, 'P_100' as part_id
  union all 
  select 'T_10000', 'L_1000', 'P_101'
  union all
  select 'T_10000', 'L_1001', 'P_103'
  union all 
  select 'T_10001', 'L_1002', 'P_104'
)


我想进一步反规范化这个表,以消除所有重复的值。bigquery中的数组似乎是一个很好的选择。
下面的值很接近,但仍在第二列中返回重复的值。

select trans_id, array_agg(line_item_id), array_agg(part_id)
from transactions
group by 1


此外,下面的值也很接近,但现在在第一列中包含重复的值。

select trans_id, line_item_id, array_agg(part_id)
from transactions
group by 1, 2


有没有一个直接的方法来实现这一点?

vlf7wbxs

vlf7wbxs1#

下面是bigquery标准sql


# standardSQL

SELECT trans_id,
  ARRAY_AGG(STRUCT(line_item_id, parts)) items
FROM (
  SELECT trans_id, 
    line_item_id, 
    ARRAY_AGG(part_id) parts
  FROM transactions
  GROUP BY trans_id, line_item_id
)
GROUP BY trans_id

当应用于问题的样本数据时-结果是

7ivaypg9

7ivaypg92#

这就是你想要的吗?

select trans_id, array_agg(distinct line_item_id), array_agg(part_id) as parts
from transactions t
group by trans_id;

相关问题