3

我正在尝试使用 dbt 中的 for 循环在 BigQuery 中的单个数据集中创建单个表,遍历帐户列表,但到目前为止没有成功。一点上下文 - 我正在使用 Stitch 从 Facebook Ads 获取数据并将其推送到我们的 BigQuery 仓库。然后,根据下面的模型,为每个帐户创建新的单独表,其中包含聚合/建模数据。

变量的声明如下所示:

-- table that contains list of accounts
{% set account_data = ref('bq_acct_list') %} 
{% set accounts = get_column_values(table=account_data, column='bq_name_suffix') %}

表必须基于的查询是:

SELECT 
        DATE_TRUNC(DATE(date_start), DAY) date,
        account_id,
        account_name,
        ROUND(SUM(spend), 2) ad_spend
FROM `{{ target.project }}.{{account}}.ads_insights`
GROUP BY 1, 2, 3

缺少的(我认为)是查询的包装器+ for 循环本身。谁能帮我填空?

4

1 回答 1

7

dbt 在一个模型(即目录.sql中的文件models/)的范式下运行,由数据仓库中的一个对象(表/视图)表示——目前没有办法解决这个问题。

如果您需要为每个帐户维护单独的表格,我会考虑:

  1. 将逻辑包装成一个宏:
-- macros/account_transform.sql
{% macro account_transform(account) %}
SELECT 
        DATE_TRUNC(DATE(date_start), DAY) date,
        account_id,
        account_name,
        ROUND(SUM(spend), 2) ad_spend
FROM `{{ target.project }}.{{ account }}.ads_insights`
GROUP BY 1, 2, 3
{% endmacro %}
  1. 为每个账户创建一个单独的模型,并在每个模型中调用宏:
-- models/my_first_account.sql
{{ account_transform('my_first_account') }}
-- models/my_second_account.sql
{{ account_transform('my_second_account') }}

根据您的具体用例,您还可以考虑通过将它们联合在一起来为所有帐户创建一个主表。这样,您只需创建一个模型。查看关于“将相同结构的源合并在一起”的文章,了解这种方法的一些技术。

于 2020-07-24T17:37:44.310 回答