You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

核心修复细节:

  1. 动态计算结束月份:用DBT自带的run_started_at获取当前模型运行的时间,自动算出循环的截止月份,不用手动写死年份,以后每次运行都会自动包含到当月的表。
  2. 正确的逐月循环逻辑:从2022年2月开始逐月递增,直到当前运行月份,彻底解决循环提前终止的问题。
  3. 避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:20:33