【问题标题】:SUM loop in BigQueryBigQuery 中的 SUM 循环
【发布时间】: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   |
-----------------------------------------------------------------------

【问题讨论】:

    标签: google-bigquery


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 2014-04-09
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多