简体   繁体   English

在 bigquery 中将一列与某列分开

[英]Separate one column to some column in bigquery

I have table with one column called cols .我有一个名为cols的列的表。 I want to separate cols to new column based on type: SKU and MARK using bigquery.我想根据类型将cols与新列分开:使用 bigquery 的 SKU 和 MARK。

cols

"dsc":[{"amount":30000,"c_amount":0,"d_amount":0,"d_id":"","scope":"CART","title":"Promo","type":"SKU"},{"amount":7000,"c_amount":0,"d_amount":7000,"d_id":"x","scope":"CART_D","title":"","type":"MARK"}]

The result i want is like:我想要的结果是:

sku_amount sku_c_amount sku_d_amount sku_d_id sku_scope sku_title mark_amount  mark_c_amount  mark_d_amount mark_d_id mark_scope
30000       0            0                     CART     Promo      7000         0             0               x           CART_D

Anyone know the script?有人知道剧本吗? thank you谢谢你

Consider below approach考虑以下方法

create temp table temp_table as 
  select id1,  
    max(if(key = 'type', value, null)) over (partition by id1, id2) || '_' || key as key,
    value, offset
  from (
    select md5(cols) as id1, md5(json) id2, arr[offset(0)] as key, arr[offset(1)] as value, offset
    from your_table, unnest(json_extract_array('{' || cols || '}', '$.dsc')) json with offset, 
    unnest(split(translate(json, '{}"', ''))) kv, 
    unnest([struct(split(kv, ':') as arr)])
  );

execute immediate (select '''
select * except(id1) from (select * except(offset) from temp_table)
pivot (any_value(value) for key in ("''' || string_agg(key, '","' order by offset, key) || '''"))
'''
from (select distinct key, offset from temp_table where not ends_with(key, '_type'))
);            

if applied to sample data in your question - output is如果应用于您问题中的示例数据 - output 是

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM