首页 > 解决方案 > 如何在 Google BigQuery 中操作 CURRENT_DATE()?

问题描述

我们在 BigQuery 中有一个计划查询,它根据大视图将数据附加到表中。视图引用其他视图,而这些视图又引用其他视图。在最低级别,视图根据 CURRENT_DATE() 获取数据。是这样的:

视图 1 (view_1):

SELECT Date, COUNT(1) as RecordCount FROM `project_name.dataset_name.first_table` WHERE DATE(_PARTITIONTIME) = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY) GROUP BY Date

视图 2 (view_2):

SELECT Date, COUNT(1) as RecordCount FROM `project_name.dataset_name.second_table` WHERE DATE(_PARTITIONTIME) = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY) GROUP BY Date

视图 3 (view_3): SELECT a.Date, a.RecordCount, b.RecordCount FROM `project_name.dataset_name.view_1` a LEFT JOIN `project-name.dataset_name.view_2` b ON a.Date = b.Date

我想要的是类似回填的东西;操纵 CURRENT_DATE() 以便我可以为某个历史时期构建此表。我尝试使用“手动运行”对此进行测试,但它始终输出相同的数据。我写的预定查询是这样的:

SELECT COUNT(1) as RecordCount FROM `project_name.dataset_name.table_name` WHERE DATE(_PARTITIONTIME) = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)

当我从 01-01-2020 开始手动运行并在 31-01-2020 结束时,目标表中的输出始终是昨天的记录数(这意味着 CURRENT_DATE() 仍然是今天)。

如果我没记错的话,我过去可以使用“回填”来执行此操作,但其中的输出似乎与替换回填的手动运行不同。

预期的输出类似于:

2020-03-02 3294 11201

2020-03-01 2984 10812

2020-02-29 3121 12121

2020-02-28 2912 12239 .....

但是手动运行的输出是:

2020-03-02 3294 11201

2020-03-02 3294 11201

2020-03-02 3294 11201

2020-03-02 3294 11201

......

标签: google-bigquery

解决方案


因此,如果您使用调度查询,则使用@run_date(type date) 或@run_time(type timestamp) 比current_date()使用未定义或与本地运行时相关的上下文更安全。另一个优点是在使用回填时,@run_time/@run_date 填充了回填请求中定义的模拟日期。请参阅此Google 文档

所以在你的查询中你会像这样改变它

SELECT Date, COUNT(1) as RecordCount FROM `project_name.dataset_name.first_table` WHERE DATE(_PARTITIONTIME) = DATE_ADD(@run_date, INTERVAL -1 DAY) GROUP BY Date

@run_date是 BigQuery 类型date,所以它应该可以正常工作DATE_ADD

用户@ebeltran 在对 op 的评论中也提到了这一点


推荐阅读