【问题标题】:How to combine Cross Join and String Agg in Bigquery如何在 Bigquery 中结合 Cross Join 和 String Agg
【发布时间】: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) 中是否有更好的方法。

谢谢

【问题讨论】:

    标签: python sql database google-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_ALLLTRIM

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多