【问题标题】:Replace all past values from a field with last value用最后一个值替换字段中的所有过去值
【发布时间】:2021-08-07 22:59:06
【问题描述】:

我在 BigQuery 中有一个特定字段,我想更改并填写来自同一用户的所有值,并使用其来自 max datetime 的最后一个值。

这是原始数据:

这是想要的结果:

我已经尝试过 Coalesce、case when、row_number() over partition by 等。

例子:

SELECT * FROM T1
    COALESCE (segment, LAST_VALUE(segment IGNORE NULLS) OVER (PARTITION BY userID ORDER BY datetime DESC)) newsegment

我仍然得到与第一张图像相同的结果,因为它采用最大字符的值

【问题讨论】:

    标签: sql replace google-bigquery


    【解决方案1】:

    将 FIRST_VALUE 与 DESC 条件一起使用。不需要合并。另外,在 FROM 子句之前计算 SELECT 中的 FIRST_VALUE 字段。

    SELECT T1.*, FIRST_VALUE((segment) IGNORE NULLS) 
    OVER (PARTITION BY userID ORDER BY datetime DESC) AS NewSegment 
    FROM T1;
    

    但是,我希望 LAST_VALUE 可以使用升序。

    【讨论】:

    • 如果要添加以下条件怎么办?如果用户有一个与 UNACTIVE 不同的段 --> 则检索他在上次访问时拥有的段,忽略所有 UNACTIVE 结果。如果用户只有一个 UNACTIVE 段,则为 UNACTIVE。
    • 我不明白。我不明白这是一个新的条件。也许您应该编辑您的原始问题或开始一个新问题。提供示例数据。
    【解决方案2】:

    您需要将'UNACTIVE' 转换为NULL:

    SELECT T1.*,
           LAST_VALUE(NULLIF(segment, 'UNACTIVE') IGNORE NULLS) OVER (PARTITION BY userID ORDER BY datetime DESC)
    FROM T1;
    

    由于LAST_VALUE() 的定义方式,它不需要COALESCE()。如果存在,它将从当前行中提取值。

    【讨论】:

    • FIRST_VALUE 与 DESC 没有转换产生所需的输出?
    • 谢谢,但我不应该将“非活动”转换为 null,在某些特定情况下,用户 ID 只有“非活动”状态。如果它的最后一个是“不活动的”,它必须保持不变。另外,我尝试了您的查询返回,但它为每个“非活动”行返回空值。
    • @June7 FIRST_VALUE 与 DESC 作品!谢谢!!非常有帮助 FIRST_VALUE((segment) IGNORE NULLS) OVER (PARTITION BY userID ORDER BY dateTime desc) 作为新闻片段
    • @DanielaBaluta 。 . .哦,您将 future 值放在一行中。我将排序顺序更改为 DESC 以引入未来而不是过去的值。
    • @june7 我还需要应用以下内容,但我有点卡住了:如果用户的段不同于 UNACTIVE --> 然后检索他在上次访问时忽略的段所有 UNACTIVE 结果。如果用户只有一个 UNACTIVE 段,则 UNACTIVE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2021-03-15
    • 2018-03-07
    相关资源
    最近更新 更多