3

有时,我们的表需要将多个列附加在一起以生成唯一键。这可以通过执行以下操作来完成:

select
    *,
    col1 || "_" || col2 as unique_key
from 
    my_table

这可行,但会导致多个分析师之间缺乏一致性。

我想利用 pythons *args(我认为 jinja2 使用varargs)功能来制作一个可以接受任意数量的参数并在所有参数之间创建唯一键的宏。

理想结果:

select
    *,
    unique_key(col1, col1, ..., colN)
from 
    my_table
4

1 回答 1

3

目前dbt_utils包中有一个宏可以做类似的事情,称为surrogate key。它过去只使用可变参数,现在也允许使用列表。

对于可变参数部分,它执行以下操作:

{%- for field in varargs %}
{%- set _ = field_list_xf.append(field) -%}
{%- endfor -%}

然后,您可以join()或遍历该列表来做任何您想做的事情。在宏的情况下,它执行以下操作:

{%- for field in field_list_xf -%}

    {%- set _ = fields.append(
        "coalesce(cast(" ~ field ~ " as " ~ dbt_utils.type_string() ~ "), '')"
    ) -%}

    {%- if not loop.last %}
        {%- set _ = fields.append("'-'") -%}
    {%- endif -%}

{%- endfor -%}
于 2020-10-14T18:44:50.407 回答