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
반응형
'Data > DBT' 카테고리의 다른 글
[dbt] 쿼리 결과를 변수에 저장하고 싶은 경우 | LIM (0) | 2023.12.06 |
---|---|
[dbt] dbt 도입 이유와 필요성 | LIM (0) | 2023.08.13 |
댓글