在 Google BigQuery 上按时间窗口分割时间块

Posted

技术标签:

【中文标题】在 Google BigQuery 上按时间窗口分割时间块【英文标题】:Splitting Time Blocks By Time Window on 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 函数,可以在一个时间跨度内平均,但不确定如何在平均之前先聚合它们。

【问题讨论】:

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

【讨论】:

非常感谢您的帮助,这已经解决了我的问题!

以上是关于在 Google BigQuery 上按时间窗口分割时间块的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery python - 错误分页表

谷歌 BigQuery 身份验证

Google BigQuery APPROX_QUANTILES并获得真正的四分位数

如何使用 PHP bigquery 客户端库对 bigquery 数据进行分页?

Google BigQuery 的限制?

Google Bigquery:如何从 Web UI 查询界面以编程方式创建表(保存结果)?