问题描述
有时,我们的表需要将多个列附加在一起以构成唯一键。这可以通过执行以下操作来完成:
select
*,col1 || "_" || col2 as unique_key
from
my_table
这是可行的,但会导致多个分析师之间缺乏统一性。
我想利用python *args
(我认为jinja2使用varargs
)功能来制作一个宏,该宏可以接受任意数量的参数并在所有参数之间创建唯一的键。
理想的结果:
select
*,unique_key(col1,col1,...,colN)
from
my_table
解决方法
dbt_utils包中当前有一个宏,它执行类似的操作,称为surrogate key。它曾经只使用varargs,现在还允许一个列表。
对于varargs部分,它执行以下操作:
{%- 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 -%}