5 Useful Loop Patterns in dbt
dbt์์ Jinja ๋ฃจํ์ 5๊ฐ์ง ์ฃผ์ ํจํด
1.
๋์ CASE ๋ฌธ ์์ฑ
โข
๋ชฉ์ : ์ ํ๋ช
๊ณผ ์นดํ
๊ณ ๋ฆฌ ๊ฐ์ ๋งคํ์ ์๋ํํ์ฌ ๋ฐ์ดํฐ ๋ถ๋ฅ๋ฅผ ํจ์จ์ ์ผ๋ก ์ํ
โข
๊ตฌํ ๋ฐฉ๋ฒ:
{% set type_mapping = {
"shirt": "clothing",
"truck": "vehicle",
"hat": "clothing"
} %}
case
{% for key, value in type_mapping.items() %}
when product_name == '{{ key }}' then '{{ value }}'
{% endfor %}
else 'other'
end as product_type
SQL
๋ณต์ฌ
โข
์ฅ์ :
โฆ
๋งคํ ๊ท์น ๋ณ๊ฒฝ ์ dictionary๋ง ์์ ํ๋ฉด ๋จ
โฆ
์๋์ผ๋ก CASE ๋ฌธ์ ์์ฑํ ํ์๊ฐ ์์
โฆ
์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์
2.
UNION ๋ฌธ ์์ฑ
โข
๋ชฉ์ : ์ฌ๋ฌ ๊ด๋ จ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ํตํฉ
โข
๊ตฌํ ๋ฐฉ๋ฒ:
{% set products = ["pants", "shirts", "shoes"] %}
{% for product in products %}
select
id,
product_name,
product_price
from {{ ref('seed_' + product) }}
{% if not loop.last %}union all{% endif %}
{% endfor %}
SQL
๋ณต์ฌ
โข
์ฅ์ :
โฆ
์๋ก์ด ์ ํ ํ
์ด๋ธ ์ถ๊ฐ ์ ๋ฆฌ์คํธ๋ง ์
๋ฐ์ดํธํ๋ฉด ๋จ
โฆ
๋์ผํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ํ
์ด๋ธ์ ์ฝ๊ฒ ํตํฉ
โฆ
์ฝ๋ ์ค๋ณต ์ต์ํ
3.
CTE ์๋ํ
โข
๋ชฉ์ : ์ฌ๋ฌ ์์ค ํ
์ด๋ธ์ ๋ํ ๊ณตํต ํ
์ด๋ธ ํํ์์ ์๋ ์์ฑ
โข
๊ตฌํ ๋ฐฉ๋ฒ:
{% set sources = ["customers", "orders", "inventories"] %}
with
{% for source in sources %}
{{ source }}_cte as (
select * from {{ ref('seed_' + source) }}
)
{% if not loop.last %},{% endif %}
{% endfor %}
SQL
๋ณต์ฌ
โข
์ฅ์ :
โฆ
๋ณต์กํ ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋ ๊น๋ํ๊ฒ ๊ตฌ์ฑ
โฆ
์๋ก์ด ๋ฐ์ดํฐ ์์ค ์ถ๊ฐ๊ฐ ์ฉ์ด
โฆ
์ผ๊ด๋ CTE ๋ค์ด๋ฐ ์ปจ๋ฒค์
์ ์ง
4.
์ ์ฐํ ์ง๊ณ ์ฒ๋ฆฌ
โข
๋ชฉ์ : ์ฌ๋ฌ ์ง์ญ์ด๋ ์นดํ
๊ณ ๋ฆฌ์ ๋ํ ์ง๊ณ๋ฅผ ์๋ํ
โข
๊ตฌํ ๋ฐฉ๋ฒ:
{% set regions = ["north", "south", "east", "west"] %}
select
{% for region in regions %}
sum({{ region }}_sales) as total_{{ region }}_sales
{% if not loop.last %}, {% endif %}
{% endfor %}
SQL
๋ณต์ฌ
โข
์ฅ์ :
โฆ
์๋ก์ด ์ง์ญ ์ถ๊ฐ ์ ๋ฆฌ์คํธ๋ง ์์ ํ๋ฉด ๋จ
โฆ
์ผ๊ด๋ ์ง๊ณ ๋ก์ง ์ ์ฉ
โฆ
์ค์ ๊ฐ๋ฅ์ฑ ๊ฐ์
5.
ํจ์ ํ๋ผ๋ฏธํฐ ์์ฑ
โข
๋ชฉ์ : ํต๊ณ ํจ์์ ๋ํ ์ฌ๋ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๋์ ์ผ๋ก ์์ฑ
โข
๊ตฌํ ๋ฐฉ๋ฒ:
{% set percentiles = range(25, 99, 25) %}
select
{% for p in percentiles %}
percentile_cont({{ p }} / 100)
within group (order by price) as price_p{{ p }}
{% if not loop.last %}, {% endif %}
{% endfor %}
SQL
๋ณต์ฌ
โข
์ฅ์ :
โฆ
๋ถ์์ ๊ณ์ฐ์ ์๋ํ
โฆ
ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ฒ์๋ฅผ ์ฝ๊ฒ ์กฐ์ ๊ฐ๋ฅ
โฆ
์ฌ๋ฌ ์งํ์ ๋ํ ์ผ๊ด๋ ํต๊ณ ๊ณ์ฐ
๋ชจ๋ฒ ์ฌ๋ก์ ์ฃผ์์ฌํญ:
1.
๋ฃจํ ์ฌ์ฉ ์ ๊ณ ๋ ค์ฌํญ:
โข
์ ์ ํ ๋ค์ฌ์ฐ๊ธฐ๋ก ๊ฐ๋
์ฑ ์ ์ง
โข
loop.last๋ฅผ ํ์ฉํ ๊ตฌ๋ถ์(์ผํ ๋ฑ) ๊ด๋ฆฌ
โข
๋ช
ํํ ๋ณ์๋ช
๊ณผ ์ฃผ์ ์ฌ์ฉ
2.
์ฑ๋ฅ ์ต์ ํ:
โข
๋๋ฌด ํฐ ๋ฆฌ์คํธ๋ ๋ณต์กํ ๋ก์ง์ ํผํ๊ธฐ
โข
์์ฑ๋ SQL์ ์คํ ๊ณํ ํ์ธ
โข
์ ์ ํ ํ
์คํธ ์ผ์ด์ค ์์ฑ
3.
์ ์ง๋ณด์์ฑ:
โข
๋ฆฌ์คํธ๋ ๋์
๋๋ฆฌ๋ ๋ณ๋ ๋งคํฌ๋ก๋ ์ค์ ํ์ผ๋ก ๊ด๋ฆฌ
โข
๋ฌธ์ํ๋ฅผ ํตํ ํจํด ์ฌ์ฉ๋ฒ ๊ณต์
โข
์ผ๊ด๋ ๋ค์ด๋ฐ ์ปจ๋ฒค์
์ ์ง