我在Big Query中使用计划的查询,该查询将前一天的数据追加到Big Query表中。前一天的数据在查询运行时并不总是可用,因此,为了确保我拥有所有数据,我需要计算“大查询”表中的最后可用日期。
我的第一次尝试是写以下查询:
SELECT *
FROM sourceTable
WHERE date >= (SELECT Max(date) from destinationTable)
当我运行此查询时,仅正确导出日期> = max(date)。但是,查询处理整个sourceTable,而不仅是J-max(date)。因此,成本高于预期。
我还试图使用“ DECLARE”&“ SET”(https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting)声明变量。该解决方案可以正常工作,并且仅处理J-max(date)。但是,BQ将以“ DECLARE”作为查询的查询解释为脚本,因此无法使用计划的查询将结果自动导出到BQ表。
DECLARE maxDate date;
SET maxDate = (SELECT Max(date) from destinationTable);
SELECT *
FROM sourceTable
WHERE date >= maxDate
还有另一种做我想做的事情吗?还是在带有目标表的计划查询中使用“ DECLARE”和“ SET”声明变量的方法?
谢谢!
destinationTable
是否已分区?如果没有,您可以将其重新创建为分区表吗?如果它是分区表,并且在destinationTable.date
列上已分区,则可以执行以下操作:
SELECT *
FROM sourceTable
WHERE date >= (SELECT MAX(_PARTITIONTIME) from destinationTable)
由于_PARTITIONTIME
是伪列,因此运行子查询没有任何花费。