使用 BigQuery 中的条件计算运行总计

Posted

技术标签:

【中文标题】使用 BigQuery 中的条件计算运行总计【英文标题】:Calculate a running total with a condition in 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:删除了我的“即时问题”。

【问题讨论】:

【参考方案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;

【讨论】:

谢谢!试过这个,但做错了什么。无法让它工作。我的表格要复杂得多,但我明白了这个概念。

以上是关于使用 BigQuery 中的条件计算运行总计的主要内容,如果未能解决你的问题,请参考以下文章

多个 Big Query 表或类似数据的单数表

在 BigQuery 中,您将如何使用两个日期列计算每月和每日总计?

BigQuery:如何随时间对运行总计进行抽样

如何从 Google App Script 中的文件运行保存的 Big Query 脚本? [关闭]

在 Big Query 的表中查找特定条件的属性计数

Pyspark/Hive 中带条件的加权运行总计