基于Jinja实现DBT增量查询:动态合并表并终止于当前月
搞定DBT里用Jinja动态合并月度表的问题
直接上修复后的SQL代码,解决循环无法终止到当前月、以及仅到2023年2月就停止的问题:
{% set start_date = modules.datetime.date(2022, 2, 1) %} {% set end_date = run_started_at.date().replace(day=1) %} {% set month_list = [] %} {% set current_date = start_date %} {% while current_date <= end_date %} {% set year_month = current_date.strftime('%Y%m') %} {% do month_list.append(year_month) %} {% set next_month = current_date.month + 1 %} {% set next_year = current_date.year %} {% if next_month > 12 %} {% set next_month = 1 %} {% set next_year = next_year + 1 %} {% endif %} {% set current_date = modules.datetime.date(next_year, next_month, 1) %} {% endwhile %} SELECT * FROM ( {% for year_month in month_list %} {% if not loop.first %} UNION ALL {% endif %} SELECT *, '{{ year_month }}' as source_month -- 可选加个来源月份标记,查数据方便 FROM your_table_prefix_{{ year_month }} {% endfor %} ) combined_data
核心修复细节:
- 动态计算结束月份:用DBT自带的
run_started_at获取当前模型运行的时间,自动算出循环的截止月份,不用手动写死年份,以后每次运行都会自动包含到当月的表。 - 正确的逐月循环逻辑:从2022年2月开始逐月递增,直到当前运行月份,彻底解决循环提前终止的问题。
- 避免SQL语法错误:通过
loop.first判断,仅在非第一个表前添加UNION ALL,不会出现开头多一个UNION的语法问题。
按需小调整:
如果仓库里当月的表要等下个月才生成,需要把结束日期改成上个月的第一天,修改一行即可:
{% set end_date = (run_started_at.date().replace(day=1) - modules.datetime.timedelta(days=1)).replace(day=1) %}
内容的提问来源于stack exchange,提问作者Jnana vardhan
相关产品推荐
相关产品推荐

