我正在嘗試在 DBT 工具“回圈”中創建將數字作為變數的表,我也在宏中使用了相同的變數。問題在工會部分。DBT 正在嘗試使用基于數字的表名創建聯合,這在 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
我不知道這是否可能,或者我錯過了什么。如果有人有任何想法,我將不勝感激。
謝謝
uj5u.com熱心網友回復:
歡迎!你問了一個新人的好問題!
基本上,我想你是在問
- 如何在 jinja 中為字串串列的每個元素添加前綴?
- 我怎樣才能以“干凈”的 dbt-eque 方式做到這一點?
我不是 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) }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329725.html
標籤:PostgreSQL 循环 jinja2 数据库
