我们如何将select语句定义为dbt中的变量



Hi我正试图在dbt中的一个集合变量中定义一个select语句,有人能建议如何将sqlquery设置为dbt中的变量,以及如何访问下面CTE中的这些变量吗?

您可以使用call statement并使用load_result在变量中获得结果

以下是从select语句中只检索一个字段的示例:

{%- call statement('my_statement', fetch_result=True) -%}
SELECT my_field FROM my_table
{%- endcall -%}
{%- set my_var = load_result('my_statement')['data'][0][0] -%}

然后您可以使用{{ my_var }}

根据所选返回的行和列,您可以使用['data'][0][0]

您可以考虑将SQL语句嵌入宏中,并在模型中调用该宏。

{% macro get_data() %}
{% set query %}
select
column_a_boolean,
column_b_varchar
from my_table
{% endset %}
{% set results = run_query(query) %}
{# execute is a Jinja variable that returns True when dbt is in "execute" mode i.e. True when running dbt run but False during dbt compile. #}
{% if execute %}
{% set results_list = results.rows %}
{% else %}
{% set results_list = [] %}
{% endif %}
{{ return(results_list) }}
{% endmacro %}

然后可以在模型中使用上述宏。例如,在下面的模型中,如果列column_a_boolean中的值等于true,则我们UNION宏返回的记录。

{% for record in get_data() %}
{% if record.column_a_boolean == true %}
{% if not loop.first %}
UNION ALL
{% endif %}
SELECT
record.column_b_varchar
{% endif -%}
{% endfor %}

您可以使用dbt_utils.get_column_values:

{%- set my_var = dbt_utils.get_column_values(
table = source('source_name', 'object_name'), 
column = 'my_col',
where = "my col != 'some_value") -%}
{%- for x in my_var %}
select 
'{{ x }}' as test
from {{ source(x, 'object_name') }}
{% if not loop.last -%} 
union all 
{%- endif -%}
{%- endfor -%}

确保您的packages.yml文件包含dbt-utils:

packages:
- package: dbt-labs/dbt_utils
version: 1.0.0 # latest version as time of writing, change as needed

然后运行dbt deps初始化包:

$ dbt deps

run_query文档也有一个很好的例子。

{% macro hello() %}
{% if execute %}
{% set results = run_query("select 'hello'; ").columns[0].values()[0] %}
{% endif %}
select {{results}} as id;
{% endmacro %}
output 
results will contain hello

最新更新