【问题标题】:BigQuery SQL: replace values from a field with multiple conditionsBigQuery SQL:用多个条件替换字段中的值
【发布时间】:2021-08-08 12:27:17
【问题描述】:

抱歉,这篇文章太长了,我只是尽力解释一下。我正在 BigQuery 中处理来自 Analytics 的数据。

这是我的初始表格:

每当 fullVisitorId 相同时,我必须对此进行一些转换,以首先“填充”用户 ID 中的所有空白,并将此新字段称为transformed_userID,从而获得用户的最后一次访问。

我现在需要得到的是userID的实际段:下图中的字段desired_segment,我还没有设法得到。

这是我正在寻找的逻辑: 如果用户有一个与 UNACTIVE 不同的段 --> 则检索他在上次访问时拥有的段,忽略所有 UNACTIVE 结果。如果用户只有一个 UNACTIVE 段,则为 UNACTIVE。

顺便说一句,我尝试应用 first_value(在另一篇文章的帮助下),但这不是我理想的结果:FIRST_VALUE((segment) IGNORE NULLS) OVER (PARTITION BY translate_userID ORDER BY dateTime desc) newSegment_transformedUserID。如果我在 over partition by 中使用初始用户 ID,则会得到错误的结果,如字段 newSegment_initialUserID 中所示。

我已经尝试了好几个小时... :(

【问题讨论】:

  • 我很困惑。您是要计算转换后的列,还是新的段列或两者兼而有之?当您的示例显示来自过去和未来的数据时,您为什么说您想要 previous 值。
  • 嗨@戈登林诺夫!我正在尝试计算列段,最终结果应如列所需的段所示。逻辑是:如果用户有一个段不同于“非活动”-> 然后检索他在上次访问中拥有的段,忽略所有“非活动”结果。如果用户只有一个“非活动”段,则为“非活动”。

标签: sql replace google-bigquery


【解决方案1】:

您忽略了NULL 值,但此列中没有NULL 值。所以你需要NULLIF():

LAST_VALUE(NULLIF(segment, 'UNACTIVE') IGNORE NULLS) OVER (
    PARTITION BY transformed_userID
    ORDER BY dateTime
   ) as newSegment_transformedUserID

如果您有多个条件,请使用CASE 表达式:

LAST_VALUE(CASE WHEN segment NOT IN ('UNACTIVE') THEN segment END) IGNORE NULLS) OVER (
    PARTITION BY transformed_userID
    ORDER BY dateTime
   ) as newSegment_transformedUserID

【讨论】:

  • 嗨!这个很好用!! :) 有没有办法在 NULLIF 中添加几个条件?我在 nullif 中尝试了以下操作,但它不起作用:NULLIF(segment, 'UNACTIVE', 'UNACTIVE_nonbuyer')
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2021-10-18
  • 2016-01-21
  • 2021-08-17
  • 2018-10-29
相关资源
最近更新 更多