如何在 BigQuery SQL 中使用 UNNEST 和 SPLIT 避免重复?

Posted

技术标签:

【中文标题】如何在 BigQuery SQL 中使用 UNNEST 和 SPLIT 避免重复?【英文标题】:How can I avoid duplicates using UNNEST and SPLIT in BigQuery SQL? 【发布时间】:2021-04-17 22:01:00 【问题描述】:

我有以下数据

Id Historical_UTMs
1 a,b,c,d;e,f,g,h;
2 i,j,k,l;
3 m,n,o,p;q,r,s,t;u,v,w,x;

我想以以下结尾

Id utm_Type utm_Timestamp utm_Web_Page utm_Referrer
1 a b c d
1 e f g h
2 i j k l
3 m n o p
3 q r s t
3 u v w x

我想将 Historical_UTMs 字段的内容拆分为不同的行(由 ; 分隔),所有行都保留 Id 字段,并且还想拆分新行中的每个值(由 , 分隔)。

我有以下脚本可以创建一个包含正确信息的表。 问题是所有的记录都是重复的。

有没有人可以帮助我理解为什么这个脚本会创建重复的行,以及如何解决它?

with Expanded as (
  select 
    Lead.Id,
    Lead.Historical_UTMs
  from
    `dataset.GS_UTMs` AS Lead,
    unnest(split(Historical_UTMs,';')) AS History_UTMs
)

select
  Expanded.Id,
  split(Expanded.Historical_UTMs,',')[safe_offset(0)] as utm_Type,
  split(Expanded.Historical_UTMs,',')[safe_offset(1)] as utm_Timestamp,
  split(Expanded.Historical_UTMs,',')[safe_offset(2)] as utm_Web_Page,
  split(Expanded.Historical_UTMs,',')[safe_offset(3)] as utm_Referrer,

from
  Expanded

【问题讨论】:

您使用的是unnest,然后没有使用结果(CTE 根本不引用History_UTMs,除了创建它。)...为什么? (请注意,由于您提供 no 示例数据,因此几乎不可能告诉您应该做什么。) 请提供样本数据和所需结果。 我现在添加了一些示例数据 【参考方案1】:

考虑下面

select Id, 
  UTM[offset(0)] as utm_Type,
  UTM[offset(1)] as utm_Timestamp,
  UTM[offset(2)] as utm_Web_Page,
  UTM[offset(3)] as utm_Referrer
from `project.dataset.GS_UTMs`,
unnest(split(trim(Historical_UTMs, ';'), ';')) Historical_UTM,
unnest([struct(split(Historical_UTM) as UTM)])        

如果应用于您问题中的样本数据 - 输出是

【讨论】:

【参考方案2】:

如果我理解正确,问题是historical_utms 在 CTE 中具有多种含义,而您使用了错误的含义。也许这样的事情会起作用:

with Expanded as (
      select l.Id, Historical_UTM
      from `stormgeo-bigquery.Data_to_send_to_BigQuery_from_Google_Sheet.GS_UTMs` l cross join
           unnest(split(Historical_UTMs,';')) AS History_UTM
          )
select e.Id,
       split(e.Historical_UTM, ',')[safe_offset(0)] as utm_Type,
       split(e.Historical_UTM, ',')[safe_offset(1)] as utm_Timestamp,
       split(e.Historical_UTM, ',')[safe_offset(9)] as utm_Web_Page,
       split(e.Historical_UTM, ',')[safe_offset(10)] as utm_Referrer
from Expanded e;

【讨论】:

以上是关于如何在 BigQuery SQL 中使用 UNNEST 和 SPLIT 避免重复?的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:如何在 C# 中启用标准 SQL

如何在 BigQuery 的新 SQL 查询中连接/使用已保存的查询

BigQuery 标准 SQL 如何将行转换为列

如何在 BigQuery 标准 SQL 中查询 Bigtable 列值?

如何在 BigQuery 中使用标准 SQL 查询 GA RealtimeView?

在 Python 中运行 BigQuery SQL 查询,如何进行身份验证?