【问题标题】:Calculate a running total with a condition in BigQuery使用 BigQuery 中的条件计算运行总计
【发布时间】:2020-03-28 16:51:09
【问题描述】:

对不起,糟糕的话题…… 我需要计算一个运行总计,但需要在某个条件下重置总计(当预期达到 = 0 时)。 我有这张桌子:

Date, Registrations, Expected Registrations, Expected reached
        2020-03-01, 5, 4,1
        2020-03-02, 7, 5,1
        2020-03-03, 8, 6,1
        2020-03-04, 2, 5,0
        2020-03-05, 5, 4,1
        2020-03-06, 7, 5,1
        2020-03-07, 8, 6,1
        2020-03-08, 2, 5,0

带有运行总计的预期结果 - 条件是当“预期达到” 0 运行总计时应计算。如果“Expected Reached” = 0,则运行总计应从 0 开始:

Date, Registrations, Expected Registrations, Expected Reached, Running Total
            2020-03-01, 5, 4,1, 1
            2020-03-02, 7, 5,1, 2
            2020-03-03, 8, 6,1, 3
            2020-03-04, 2, 5,0, 0
            2020-03-05, 5, 4,1, 1
            2020-03-06, 7, 5,1, 2
            2020-03-07, 8, 6,1, 3 
            2020-03-08, 2, 5,0, 0

我不知道如何分区我的窗口函数来做到这一点。也许我之前必须创建一个中间计算,但我不确定。有什么建议吗?

编辑: edit2:删除了我的“即时问题”。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT * EXCEPT(grp), 
      SUM(Expected_reached) OVER(PARTITION BY grp ORDER BY `date`) Running_Total
    FROM (
      SELECT *, COUNTIF(Expected_reached = 0) OVER(ORDER BY `date`) grp 
      FROM `project.dataset.table`
    )
    

    【讨论】:

    • 如果我将两个字段添加到我的表中 - 产品组和产品,我将这些字段添加到 countif 的 OVER 子句中,如下所示:countif(expected_reached=0) OVER (PARTITION BY product_group, product ORDER BY date_date asc,product_group,product)。问题是 grp 将从 0 开始,然后我没有唯一的数据“岛”来在下一步中进行分区。有什么建议吗?
    • 当您更改“即时”问题时,SO 不受欢迎,特别是如果它已经回答 - 通过更改问题 - 您使答案无效。请在新帖子中发布您的新问题,我们很乐意为您提供帮助
    • 我想为什么要创建一个新帖子?但是,好的,我会创建它。
    • 当然,这是用户常犯的“错误”。但正如我上面提到的,这不是 SO 的工作方式。 SO 是问答网站。不是讨论网站。所以一次一个问题。下一个问题 - 新帖子等等......在下一个帖子中见:o)
    【解决方案2】:

    使用累积和来定义“岛屿”。然后使用row_number():

    select t.*,
           (case when expected_reached > 0
                 then row_number() over (partition by grp, (expected_reached = 0) 
                                         order by date
                                        )
                 else 0
            end) as running_total
    from (select t.*,
                 countif(expected_reached = 0) over (order by date) as grp
          from t
         ) t;
    

    【讨论】:

    • 谢谢!试过这个,但做错了什么。无法让它工作。我的表格要复杂得多,但我明白了这个概念。
    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2020-07-09
    • 2015-08-09
    • 2013-12-13
    • 2013-01-17
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多