1

我正在尝试模拟以下情况:

  • 给定一些查询,返回多列结果集(例如run_querydb_utils.get_query_results_as_dict

  • 在案例/陈述中迭代

例如:

{% set conditions = dbt_utils.get_query_results_as_dict("select comment, criteria from " 
~ ref('the_model') %}

...
select case
{% for condition in conditions %}
when {{ condition["criteria"] }}
then {{ condition["comment"] }}
{% endfor %}

无法使其正常工作,任何指导表示赞赏。

我尝试过的一些想法:

  • get_column_values x2 并将它们压缩到一个新的元组列表中。zip not recognised
  • 获取计数(*),the_model然后尝试迭代范围 - 遇到类型问题
  • 各种for条件{% for k, v in conditions.items() %}
4

1 回答 1

2

能够通过以下方式自行解决:

{% set conditions = dbt_utils.get_query_results_as_dict("select criteria, comment from " ~ ref('reference_data') ~ " order by sequence desc") %}

with main as (
    select * from {{ ref('my_other_model') }}
),

-- [NEEDS_REVIEW] there's probably a cleaner way to do this iteration - however it's interpolated result. Could do with the zip function.
comments as (
    select
        *,
        case
            {# {{- log(conditions, info=True) -}} #}
            {%- for comment in conditions.COMMENT -%}
            when {{ conditions.CRITERIA[loop.index0] }}
            then '{{ comment }}'
            {% endfor %}
        end as comment

        from main
)

select * from comments

问题:

  • 这是在雪花上,所以函数返回的键将被大写,因为这就是我加载数据的方式。
  • 使用loop.index0获取循环的当前迭代并索引到另一个元组集合(在本例中CRITERIA)。
  • SEQUENCE我在我的参考数据中添加了一个键,只是为了通过使用它来确保一致的渲染。标准确实有一点重叠,所以这很重要。
于 2020-08-07T16:10:02.523 回答