sql - dbt 宏 - 使用 *args/**kwargs

标签 sql jinja2 snowflake-cloud-data-platform dbt

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

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

这行得通,但导致多个分析师之间缺乏统一性。

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

理想的结果:

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

最佳答案

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 -%}

关于sql - dbt 宏 - 使用 *args/**kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64359410/

相关文章:

mysql - 比较mysql中单个表中的相邻行

php - 放入数据库的图像信息(名称、类型、大小、url)

python - Ansible - 如何在不同键的 yaml 中使用 selectattr

sql - 密集排名跳过空值按多个分区

php - MySQL - 如何更改表中行的顺序

sql - 在Oracle SQL中:如何将当前日期和时间插入表中?

Ansible 在任务中注册变量并在模板中使用它

python - Flask-Babel 本地化 js 中的字符串

sql - 授予选择 future View 雪花

sql - 从雪花中批量读取行