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

DBT中CTE模型调用宏传递值错误问题求助

问题解决:宏传递字段值错误的修复

你遇到的问题是调用宏时传了字符串"level",导致宏在编译阶段把这个字符串转成int得到0,所以打印输出总是Running some_macro: 0, level,最终生成的SQL里segment_level都是固定值,不会根据实际level字段计算。

问题根源

你调用宏时用了{{ map_level_to_level_range("level") }},这里的"level"是字符串字面量,不是对表中level字段的引用。宏在Dbt编译阶段会直接处理这个字符串,把它转成int时,非数字字符串会被转为0,所以所有分支都走第一个条件,得到'00 - 04'。

修复方案

要让宏生成能在SQL执行阶段根据每条记录的level字段计算的表达式,而不是在编译阶段直接计算固定值。修改如下:

修改后的CTE代码

final_table as (
        select
            toDate(`log_time`, 'Asia/Ho_Chi_Minh') as `report_date`,
            `social_type`,
            `platform_id`,
            {{ map_level_to_level_range("level") }} as `segment_level`,
            `level`
        from last_user_action
)

修改后的宏代码

{% macro map_level_to_level_range(level_column) %}
    case
        when {{ level_column }} between 0 and 4 then '00 - 04'
        when {{ level_column }} between 5 and 9 then '05 - 09'
        when {{ level_column }} between 10 and 14 then '10 - 14'
        when {{ level_column }} between 15 and 19 then '15 - 19'
        when {{ level_column }} between 20 and 24 then '20 - 24'
        when {{ level_column }} between 25 and 29 then '25 - 29'
        when {{ level_column }} between 30 and 34 then '30 - 34'
        when {{ level_column }} between 35 and 39 then '35 - 39'
        when {{ level_column }} between 40 and 44 then '40 - 44'
        when {{ level_column }} between 45 and 49 then '45 - 49'
        when {{ level_column }} between 50 and 54 then '50 - 54'
        when {{ level_column }} between 55 and 59 then '55 - 59'
        when {{ level_column }} between 60 and 64 then '60 - 64'
        when {{ level_column }} between 65 and 74 then '65 - 74'
        when {{ level_column }} between 75 and 84 then '75 - 84'
        when {{ level_column }} between 85 and 99 then '85 - 99'
        when {{ level_column }} between 100 and 114 then '100 - 114'
        when {{ level_column }} between 115 and 129 then '115 - 129'
        when {{ level_column }} between 130 and 149 then '130 - 149'
        when {{ level_column }} >= 150 then '150+'
        else '-1'
    end
{% endmacro %}

说明

修改后的宏会生成SQL的case表达式,在SQL执行阶段,每条记录都会用自己的level字段值去匹配条件,得到正确的segment_level。之前的写法是在Dbt编译阶段就把值固定了,自然无法对应每条记录的实际level。

内容的提问来源于stack exchange,提问作者Thủy Hồ Hải

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:30:58