我在源表中有一些变体结构,我需要阅读,查找并进入目标表中的另一个变体结构。
-源表:点击次数
create table clicks
(payload variant
);
-设置点击数据
insert into clicks
select
object_construct(
'language', 'en-us',
'browser', 'chrome',
'color', '35',
'event_ids', '190,195'
)
union
object_construct(
'language', 'en-us',
'browser', 'chrome',
'color', '32',
'event_ids', '201,203,190,195'
)
union
select
object_construct(
'language', 'en-us',
'browser', 'mozilla',
'color', '38',
'event_ids', '188,190,202,203,195,176'
);
-目标表:clicks_processed
create table clicks_processed
(payload variant,
click_events variant )
查阅表:click_event
create table click_event
(
key varchar,
event_id varchar,
desc varchar
)
-设置click_event的数据
insert into click_event (key,event_id,desc)
select 'event201','201','pic_click'
union
select 'event202','202','vid_view'
union
select 'event203','203','download'
要求: 将记录插入clicks_processed表中。
clicks_processed表的有效负载列与clicks表的有效负载相同。
clicks_processed表的click_events列:必须从clicks.payload中拉出event_ids键,并与查找表“ click_event”结合在一起以形成变体,该变体将插入到clicks_processed表的click_events列中
所需的输出:clicks_processed(仅将click_event中匹配的event_id填充到click_events下)
注意:第一个记录的click_events为空,因为click_event查找表中的event_ids都不匹配(仍然需要该记录)
我想出的当前代码:
select max(payload),
object_agg(e.key,object_construct(
'code', e.event_id,
'desc', e.desc
)) as click_events
from clicks c, table(flatten(input => split(c.payload:event_ids,','))) as f
inner join click_event e on e.event_id = f.value
group by seq
如果所有记录都具有与click_event匹配的event_id,否则效果很好(否则,不是上面的示例中的第一条记录),单击click_event的左联接也无济于事。
此外,不确定这是否是最好的代码,尤其是担心使用max(payload)和group by。在实际情况下,有效负载非常庞大,大约有500个键,event_ids可以容纳大约30至50个事件,这意味着拼合也炸毁了许多记录。
谢谢!
答案 0 :(得分:0)
select any_value(payload),
object_agg(e.key,object_construct(
'code', e.event_id,
'desc', e.desc
)) as click_events
from (
select f.seq, f.value::varchar as value, c.payload
from clicks c,
lateral flatten(input => split(c.payload:event_ids,',')) as f
) a
left join click_event e
on a.value = e.event_id
group by a.seq;
展平数组,然后作为左联接联接回到click_event。不过,这将为您提供一个空数组,而不是NULL。
还请在any_value()
函数上使用max()
函数,因为该值在seq
值之间始终相同。