BigQuery 中的 SUM 循环

Posted

技术标签:

【中文标题】BigQuery 中的 SUM 循环【英文标题】:SUM loop in BigQuery 【发布时间】:2018-11-24 19:23:00 【问题描述】:

BigQuery 中是否可以进行这种聚合?我有两个字段——日期时间和值(float64)。每 10 分钟在表格中发布一个值:

-----------------------------------
| datetime              | value   |
-----------------------------------
| 2018-11-01T09:00:05   | 1.1     |
| 2018-11-01T09:10:01   | 1.2     |
| 2018-11-01T09:20:59   | 2.4     |
| 2018-11-01T09:30:18   | 0.8     |
| ...                   | ...     |
| 2018-11-21T22:50:04   | 2.1     |
| ...                   | ...     |
| 2018-11-30T23:59:59   | 4.2     |
-----------------------------------

有没有办法获取包含从开始到特定日期的所有先前值的日期和总和的聚合表? 例如。对于一个月,它将是 31(或 30)个日期行,并且每天的值行将具有所有先前值的总和:

-----------------------------------------------------------------------
| date                  | value                                       |
-----------------------------------------------------------------------
| 2018-11-01            | SUM of all values 2018-11-01...2018-11-01   |
| 2018-11-02            | SUM of all values 2018-11-01...2018-11-02   |
| 2018-11-03            | SUM of all values 2018-11-01...2018-11-03   |
| 2018-11-04            | SUM of all values 2018-11-01...2018-11-04   |
| ...                   | ...                                         |
| 2018-11-20            | SUM of all values 2018-11-01...2018-11-20   |
| ...                   | ...                                         |
| 2018-11-30            | SUM of all values 2018-11-01...2018-11-30   |
-----------------------------------------------------------------------

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL - 您首先按天分组并对当天的所有值求和,然后应用窗口函数来获得最终结果

#standardSQL
SELECT 
  day, SUM(value) OVER(ORDER BY day) value
FROM (
  SELECT DATE(dt) day, SUM(value) value
  FROM `project.dataset.table`
  GROUP BY day
)

如果您需要每月“重置”总和 - 您可以在下面使用

#standardSQL
SELECT 
  day, SUM(value) OVER(PARTITION BY DATE_TRUNC(day, MONTH) ORDER BY day) value
FROM (
  SELECT DATE(dt) day, SUM(value) value
  FROM `project.dataset.table`
  GROUP BY day
)

【讨论】:

非常感谢!现在它按预期工作。很棒的“重置”功能!【参考方案2】:

BigQuery CTE 通常有助于使事情更容易理解。这应该适用于您的 datetime 值:

with datevals as (
  select date(datetime) as date, sum(value) as value from `dataset.table` group by 1
)
select a.date as dt, sum((select sum(b.value) from datevals b where b.date <= a.date )) as value
from datevals a
group by 1
order by 1

【讨论】:

以上是关于BigQuery 中的 SUM 循环的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Dataproc 删除 BigQuery 表不起作用

AppEngine BigQuery PHP 库在运行时不隐含?

BigQuery AEAD 功能的密钥集管理最佳实践 [关闭]

使用 Apache Beam 向 BigQuery 传播插入时如何指定 insertId

在 Bigquery 中的 sum() 之后将科学记数法转换为浮点数

是否可以使用架构自动检测加载 BigQuery 但修改自动检测的架构?