sql - 使用 dbt for-loop 在 BigQuery 中创建多个表

标签 sql jinja2 dbt jinja2-cli

我正在尝试使用 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 循环本身。谁能帮我填空?

最佳答案

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

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

  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') }}

根据您的具体用例,您还可以考虑为所有 帐户创建一个主表,方法是将它们联合在一起。这样,您只需创建一个模型。查看关于“Unioning together identically-structured sources”的文章,了解这种方法的一些技巧。

关于sql - 使用 dbt for-loop 在 BigQuery 中创建多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63070763/

相关文章:

python - 如何使用环境变量在 dbt 中设置项目目录?

mysql - 显示带有类别的产品列表不会显示未耦合的类别

mysql - 如何将数据库中的所有表转换为一种排序规则?

php - 尝试通过php输出我的数据库中最富有的用户

ansible - 如何计算某个对象在与 Ansible 中的条件匹配的散列中出现的次数?

identity - dbt - 如何创建表创建自动增量列

amazon-redshift - 在 dbt 中使用多个数据仓库

sql - 在 SQL Server 2005 中跳过第一行?

flask - Jinja2:为每 3 个项目创建新行

python - Flask - Jinja2 如何输出不同的 <div id/class>