본문 바로가기
Data/DBT

[dbt] dbt에서 for loop 작성하기(jinja macro) | LIM

by forestlim 2023. 11. 28.
728x90
반응형

dbt for loop 작성하는 것은 파이썬의 for loop 을 작성하는 것과 매우 유사하다. 

나의 경우 union all 을 할 때 for loop 을 사용했다. 

 

💡 테스트할 테이블 스키마

date_column: date
month: int64

 

 

[for loop 을 사용하지 않은 쿼리]

select date('2023-01-01') as date_column, 1 as month
union all
select date('2023-02-01') as date_column, 2 as month
union all
select date('2023-03-01') as date_column, 3 as month

 

 

 

 

[dbt 를 활용해서 for loop 을 사용]

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

{% set date_list = ['2023-01-01', '2023-02-01', '2023-03-01'] %}
{% set month_list = [1, 2, 3] %}

{% for i in range(date_list | length) %}
    {% set date_string = date_list[i] %}
    {% set month_int = month_list[i] %}

    select 
        date('{{ date_string }}') as date_column,
        {{ month_int }} as month
    
    {% if not loop.last %}
        union all
    {% endif %}
{% endfor %}

 

 

🙋 적용한 것

- dbt jinja macro query 에서는 python zip 과 같은 기능이 없기 때문에 list length 를 활용해 두개의 리스트에서 각각의 원소를 받아올 수 있게 함

 

- loop.last 는 jinja 템플릿에서 제공하는 문법으로 반복문 내에서 현재 순회 중인 항목이 마지막 항목인지 체크하는 부분이다. 

loop.last 가 아니라면 union all 을 하게된다.

 

 


현재 쿼리는 너무 단순해서 오히려 for loop 을 적용한 dbt jinja query 가 더 길고 작성하기 귀찮아보일 수 있으나 리스트가 길어지고 쿼리가 복잡해지면 유용하게 사용할 수 있다. 

728x90
반응형

댓글