如何在 Bigquery 中结合 Cross Join 和 String Agg

Posted

技术标签:

【中文标题】如何在 Bigquery 中结合 Cross Join 和 String Agg【英文标题】:How to combine Cross Join and String Agg in Bigquery 【发布时间】:2020-12-19 00:51:28 【问题描述】:

我正在尝试从下表开始

| user_id | path                                                        | 
| 1       | Impression,Impression,Purchase, Impression, Email, Purchase |

| user_id | path                           | 
| 1       | Impression,Impression,Purchase |
| 1       | Impression, Email, Purchase    |

本质上,每次在逗号分隔的字符串中遇到“购买”时,我都会尝试为表中的每个唯一用户创建一个新行。

从我收集的少量数据来看,我需要混合使用交叉连接和字符串 agg,但我尝试在字符串 agg 中使用 case 语句,但无法获得所需的结果。

在 SQL (Bigquery) 中是否有更好的方法。

谢谢

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
with `project.dataset.table` as (
  select 1 user_id, 'Impression,Impression,Purchase, Impression, Email, Purchase' path union all
  select 2, 'Impression,Purchase,Impression,Purchase, Impression, Email'  
)
select user_id, part
from `project.dataset.table`,
unnest(split(regexp_replace(path, r'Purchase,?\s*', r'Purchase|'), '|')) part
where trim(part) != ''    

有输出

【讨论】:

非常感谢您为我节省了数小时的工作时间。我还有一个问题。在开始将值组合为逗号分隔字符串的步骤之前,我还有一个与每个路径值关联的日期。即印象及其对应的日期,电子邮件及其对应的日期。我的问题是-----在您完成上述操作后,是否可以仅在路径中没有购买的情况下获取日期差异,这两个步骤可以结合起来吗?如果您需要更多信息,请告诉我! 当然。将您的问题作为新帖子发布,其中包含所有相关详细信息以及输入和预期输出的示例,最好是您尝试过的内容 - 我们将回答/帮助您 如果有帮助,请考虑对答案进行投票:o)【参考方案2】:

我认为此查询会生成您需要的内容。它使用REGEXP_EXTRACT_ALL 和LTRIM

with data as (
select 1 as x, 'Impression, Impression, Purchase, Impression, Email, Purchase, Purchase, Something, Purchase' as y
UNION ALL
select 2 as x, 'Impression, Impression, Purchase, Impression, Email, Purchase, Purchase, Something, Purchase' as y
) 
select x, ltrim(q, ', ') from data, unnest(REGEXP_EXTRACT_ALL(y, '.+?Purchase')) as q;

【讨论】:

以上是关于如何在 Bigquery 中结合 Cross Join 和 String Agg的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中使用 SPLIT 和 CROSS APPLY 函数

在 BigQuery 中结合聚合和分析功能以减小表大小

BigQuery cacheHit 属性

Bigquery 不能将别名与扁平表结合使用

结合 BigQuery 和 Pub/Sub Apache Beam

结合 Bigquery Delete 和 Insert 语句