BigQuery:回填时如何在查询中使用run_date

BigQuery: How to use run_date in the query when back-filling

我想从昨天的 firebase 分析事件 table 中获取数据,转换数据并更新现有分区 table,其后缀与原始事件 table 相同。
对于目的地 table,我可以使用模板:shares_{run_time-24h|"%Y%m%d"}
但是在查询本身中,我能想到的是:

WHERE
_TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))

手动 运行 时效果很好,但当我使用回填(而不是回填 run_date)时显然会生成昨天的日期
我尝试使用 @run_date w/ & w/o 偏移量,但它不是有效的查询。

您应该能够将 @run_date 作为参数传递给 FORMAT_DATE:

WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)

这是可行的,因为 @run_date 的类型是 DATE,因此您可以在 DATE 表达式有效的任何地方使用它。

WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)

其实这个方法很管用。为此,我遇到了一些问题,如@SagiLow 所说,'Undeclared query parameters'。可能是因为@run_date 不能操作日期和日期之间的操作。因此,虽然在查询构造函数中它不起作用,但在回填调度中它起作用,每天在确切的日期执行查询(不要忘记你不需要 INTERVAL 因为表已经存在)。

我已经将上面的答案标记为正确,但我只想添加另一个有趣的用例作为该线程的一部分。我创建了以下查询以对 每日活跃用户 进行回填。然后可以将该查询用作 BQ 的“计划查询”。它包含 @run_time 变量(而不是 @run_date,但您也可以使用它)。注意:由于查询包含一个变量,您只能在计划查询的视图中测试它,而不能在 BigQuery 的 IDE.

中进行测试

目的地table: daus_1dayactiveusers_BackFillTest{run_time|"%Y%m%d"}

查询:

SELECT
  FORMAT_DATE('%Y%m%d', DATE(@run_time)) AS current_date,
  FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 3 DAY)) AS beg_date,
  FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 2 DAY)) AS end_date,
  TIMESTAMP_DIFF(TIMESTAMP(DATE_ADD(DATE(@run_time), INTERVAL - 2 DAY)), TIMESTAMP(DATE_ADD(DATE(@run_time), INTERVAL - 3 DAY)), HOUR) AS hours_diff,
  COUNT(DISTINCT user_pseudo_id) AS uniq_users
FROM
  `<>.analytics_12345679810.<>`
WHERE
  event_name = 'user_engagement'
  AND event_date >= FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 3 DAY))
  AND event_date < FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 2 DAY))
  AND platform = "ANDROID"