如何在 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 的新 SQL 查询中连接/使用已保存的查询
如何在 BigQuery 标准 SQL 中查询 Bigtable 列值?