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
我不知道这是否可行,还是我遗漏了什么。
如果有人有任何想法,我将不胜感激。
谢谢
欢迎光临!你问了一个新人的好问题!
本质上,我认为你在问
- How can I prefix each element of a list of strings in jinja?
- 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) }}
我正在尝试在 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
我不知道这是否可行,还是我遗漏了什么。 如果有人有任何想法,我将不胜感激。
谢谢
欢迎光临!你问了一个新人的好问题!
本质上,我认为你在问
- How can I prefix each element of a list of strings in jinja?
- 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) }}