在 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 - 错误分页表
Google BigQuery APPROX_QUANTILES并获得真正的四分位数