【发布时间】:2021-05-22 10:05:49
【问题描述】:
我正在尝试从 BigQuery 表中选择最新的分区,而不是在 DBT 模型中扫描整个表,以节省查询成本。
DBT 不允许在数据模型中使用分号,因此使用 DECLARE+SET 脚本语句不能像建议的 here 那样工作。
DBT 有一个 sql_header 宏,它允许在标头中设置一些变量,但该标头不接受对数据模型的引用,或者至少以下代码未编译:
{{ config(
sql_header=" DECLARE latest_partition_date DATE;
DECLARE latest_load_timestamp TIMESTAMP;
SET latest_partition_date = (SELECT MAX(_PARTITIONDATE) FROM {{ ref("model") }} );
SET latest_load_timestamp = (SELECT MAX(loaded_at) FROM {{ ref("model") }} WHERE _PARTITIONDATE = latest_partition_date);"
) }}
-- set the main query
SELECT * FROM {{ ref("model") }}
WHERE
-- Select the latest partition to reduce 'Bytes processed' for loading the query.
_PARTITIONDATE = latest_partition_date
-- Select the latest load within the latest partition to get only one duplicate of data.
AND loaded_at = latest_load_timestamp
我需要在标准 SQL 中解决这个问题。
建议的其他方法包括设置WHERE _PARTITIONDATE = CURRENT_DATE() 或使用DATE_SUB(CURRENT_DATE(), 3),但这些方法不能满足要求,因为数据加载中断是不可预测的,并且只能动态选择最新的方法。这可能吗?
【问题讨论】:
标签: sql google-bigquery dbt