DBT - 以数字作为变量的循环问题

DBT - for loop issue with number as variable

我正在尝试在 DBT 工具 'loop for' table 中创建将数字作为变量的变量,我在宏中也使用了相同的变量。问题在联合部分。 DBT 正在尝试使用基于数字的 table 名称创建联合,这在 postgre sql.

中是不可能的
{{ config(materialized='table') }}

{%-    set dpids = ["123","1234"]    -%}

WITH
{% for dpid in dpids %}
    {{ dpid }} AS (
        SELECT *
            FROM {{ ref('table_name') }} b
            WHERE b.create_ts > ({{ get_last_load_timestamp('table_name', dpid) }}) 
            AND b.dpid = '{{ dpid }}'
    ){% if not loop.last %},{% endif %}
{% endfor %}

{{ union_all(dpids) }}
    select * from 123 union all select * from 1234 --fail

所以我试图在数字前添加 t_ 的地方更改它,但在联合部分,dbt 尝试从字符串中获取所有字符。

with 
{% for 't_'~dpid in dpids %}
    {{ dpid }} AS (
        SELECT *
            FROM {{ ref('table_name') }} b
            WHERE b.create_ts > ({{ get_last_load_timestamp('table_name', dpid) }}) 
            AND b.dpid = '{{ dpid }}'
    ){% if not loop.last %},{% endif %}
{% endfor %}
{{ union_all('t_'~dpids) }}
select * from t 
union all 
select * from _ 
union all 
select * from 1
union all 
select * from 2
...and so on

我不知道这是否可行,还是我遗漏了什么。 如果有人有任何想法,我将不胜感激。

谢谢

欢迎光临!你问了一个新人的好问题!

本质上,我认为你在问

  1. How can I prefix each element of a list of strings in jinja?
  2. How can I do this in a "clean" dbt-eque way?

我不是 postgres 专家,但可能有一种方法可以摆脱仅以整数命名的表(转换为字符串?或引用它们?)

我的回答可能不是最干净的,但应该可以。

{{ config(materialized='table') }}

{%- set dpids = ["123","1234"]    -%}
{%- set cte_names = [] %}

WITH
{% for dpid in dpids %}
{%- set cte_name = 't_' ~ dpid %}
{% do cte_names.append(cte_name) %}
    {{ cte_name }} AS (
        SELECT *
            FROM {{ ref('table_name') }} b
            WHERE b.create_ts > ({{ get_last_load_timestamp('table_name', dpid) }}) 
            AND b.dpid = '{{ dpid }}'
    ){% if not loop.last %},{% endif %}
{% endfor %}

{{ union_all(cte_names) }}