雪花展平方案

时间:2020-05-29 09:53:13

标签: snowflake-cloud-data-platform flatten

我在源表中有一些变体结构,我需要阅读,查找并进入目标表中的另一个变体结构。

-源表:点击次数

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下)

data of clicks_processed

注意:第一个记录的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个事件,这意味着拼合也炸毁了许多记录。

谢谢!

1 个答案:

答案 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值之间始终相同。