【问题标题】:Splitting Time Blocks By Time Window on Google BigQuery在 Google BigQuery 上按时间窗口分割时间块
【发布时间】:2019-01-28 19:54:51
【问题描述】:

我有一个在 BigQuery 上运行的查询,我希望能够按特定时间范围组合行并平均其他行的值。

例如,给定这个table

timestamp                  |  value
___________________
2018-08-09 17:25:22 UTC    |  40000
2018-08-09 17:55:22 UTC    |  10000
2018-08-09 18:25:22 UTC    |  20000
2018-08-09 18:55:22 UTC    |  20000
2018-08-10 12:55:22 UTC    |  5000

我希望能够查询它,以便按小时显示结果 因此,2018-08-09 17:00:00 行将是两个时间块的组合,其平均值为 25000 (40000+10000/2)。

我如何能够在 BigQuery 中编写查询以按小时块甚至天块对其进行分组。

我希望我的查询结果是这样的:

timestamp                     | value
_____________________________________
2018-08-09 17:00:00 UTC       |  25000
2018-08-09 18:00:00 UTC       |  20000
2018-08-10 12:00:00 UTC       |  5000

BigQuery SQL 有一个 AVG 函数,可以在一个时间跨度内平均,但不确定如何在平均之前先聚合它们。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT TIMESTAMP_TRUNC(ts, HOUR) ts, AVG(value) AS value 
    FROM `project.dataset.table`
    GROUP BY TIMESTAMP_TRUNC(ts, HOUR)  
    

    您可以使用您问题中的示例数据进行测试和使用,如下例所示

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT TIMESTAMP '2018-08-09 17:25:22 UTC' ts, 40000 value UNION ALL
      SELECT '2018-08-09 17:55:22 UTC', 10000 UNION ALL
      SELECT '2018-08-09 18:25:22 UTC', 20000 UNION ALL
      SELECT '2018-08-09 18:55:22 UTC', 20000 UNION ALL
      SELECT '2018-08-10 12:55:22 UTC', 5000 
    )
    SELECT TIMESTAMP_TRUNC(ts, HOUR) ts, AVG(value) AS value 
    FROM `project.dataset.table`
    GROUP BY TIMESTAMP_TRUNC(ts, HOUR)   
    

    结果

    Row     ts                          value    
    1       2018-08-09 17:00:00 UTC     25000.0  
    2       2018-08-09 18:00:00 UTC     20000.0  
    3       2018-08-10 12:00:00 UTC     5000.0   
    

    【讨论】:

    • 非常感谢您的帮助,这已经解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 2018-06-14
    • 1970-01-01
    • 2019-08-07
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多