使用 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 中的条件计算运行总计的主要内容,如果未能解决你的问题,请参考以下文章
在 BigQuery 中,您将如何使用两个日期列计算每月和每日总计?