繁体   English   中英

StandardSQL BigQuery 值从一个数组中的键值对到单独的列中。 如何?

[英]StandardSQL BigQuery values from key:value pairs within an Array into separate columns. How?

我有一个带有数组列的 BigQuery 表,多个(1 到 4 个)键:值对由 pipe“|”分隔。 我想拉出键:值对并添加附加列,其中“键”作为列 header,“值”作为...以及值/条目。

然而,虽然有统一的“键”,但它们并不是都按相同的顺序放置,因此按顺序拆分并不能安静地工作。 我环顾四周并探索了“JSON_EXTRACT_SCALAR”和“UNNEST”(来自这个问题/答案: fetch key value pairs from array objects in sql BigQuery )但无法获得预期的结果。 我也探索过使用“OFFSET”但不知道如何将它们组合在一起。

这是数据字段(它们的数组)的样子:

Row campaignLabels  
1   Segment: Rivers Non-Brand | Strategy: All Else | Category: Non-Brand | CN:Pause_5-29-19
2   Segment: Rivers Non-Brand | Category: Non-Brand | Strategy: All Else | CN:Pause_5-29-19
3   Category: Upper Funnel | Strategy: All Else
4   Strategy: All Else | Segment: Rivers Brand | Category: Brand
5   Strategy: All Else | Category: Brand | Segment: Rivers Brand
6   Segment: Rivers Non-Brand | Category: Non-Brand | Strategy: All Else
7   Strategy: All Else | Segment: Viking Other Brand | Category: Brand
8   Strategy: All Else | Category: Brand | Segment: Rivers Brand
9   Strategy: All Else | Category: Brand | Segment: Rivers Brand
10  Strategy: All Else | Category: Brand | Segment: Viking Other Brand

理想情况下,output 是查询同一个表,提取某些列并添加带有“Strategy”、“Category”和“Segment”的列作为列标签,并将值作为返回值。

帮助!

一些尝试让我部分地在那里但不是所需的结果:

SELECT 
  DISTINCT(SUBSTR(Part1, 10)) AS Strategy
FROM (
  SELECT
    Labels[OFFSET(0)] AS Part1,
    Labels[OFFSET(1)] AS Part2,
    Labels[SAFE_OFFSET(2)] AS Part3,
    Labels[SAFE_OFFSET(3)] AS Part4
  FROM (
    SELECT
      SPLIT(campaignLabels,"| ") AS Labels
    FROM
      `table_A` )
  )
WHERE Part1 LIKE "Strategy:%"

以下是 BigQuery 标准 SQL

#standardSQL
select campaignLabels, 
  ( select as struct
      max(if(key = 'Segment', value, null)) as Segment,
      max(if(key = 'Strategy', value, null)) as Strategy,
      max(if(key = 'Category', value, null)) as Category
    from (
      select as struct kv[offset(0)] as key, trim(kv[offset(1)]) as value
      from t.labels label, 
      unnest([struct(split(label, ':') as kv)])
    )
  ).*
from `project.dataset.table`, 
unnest([struct(split(campaignLabels, ' | ') as labels)]) t    

如果将我们的问题应用于样本数据 - output 是

在此处输入图像描述

暂无
暂无

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

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