嗨,我正在尝试在 dbt 中的 set 变量中定义一个 select 语句,有人可以建议如何将 sql 查询设置为 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] -%}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用 {{ 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 %}
Run Code Online (Sandbox Code Playgroud)
然后您可以在模型中使用上述宏。例如,在下面的模型中,如果列中的值column_a_boolean
相等,我们会联合记录宏返回的记录true
。
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3790 次 |
最近记录: |