【问题标题】:dbt macro to extract MAX len of columndbt 宏提取列的 MAX len
【发布时间】:2021-11-30 15:29:05
【问题描述】:

我基本上想传入一个列,然后进行计算,自动计算我最终将作为 Decimal(x,x) 参数传递给我的 CAST 的数字,所以我总是考虑最大的 Decimal,所以没有四舍五入发生。

我想传入一个在周期上分割的目标列,计算左边的max len(),然后计算右边的max len(),然后返回(left+right,right)所以它是类似于 22,8。

到目前为止,这是我的宏:

{% macro cast_decimal(max_field, table_name) %}
    {%- call statement('cast_decimal_max', fetch_result=True) -%}
        
        WITH mq AS
        (
        SELECT MAX(len(split_part({{ max_field }},'.',1))) AS max_l,
               MAX(len(split_part({{ max_field }},'.',2))) AS max_r
        FROM {{ table_name }}
        )
        SELECT (max_l + max_r) || ',' || max_r AS max_total
        FROM mq

    {%- endcall %}
    {%- set max_existing_total = load_result('cast_decimal_max').table.columns['max_total'].values()[0] -%}
    {{ return(max_existing_total) }}
{%- endmacro %}

我不断收到此错误:“无”没有属性“表”,我不确定自己做错了什么。

如果你能告诉我如何从我的 FROM 语句中自动传入当前表,那么我不需要它作为我的宏中的参数,而不是像这样这样做:

SELECT {{ cast_decimal(close_price, public.stable_prices) }}
FROM public.stable_prices

【问题讨论】:

    标签: dbt


    【解决方案1】:
    {% macro cast_decimal(max_field, table_name) %}
    {%- call statement('cast_decimal_max', fetch_result=True) -%}
    
        WITH mq AS
        (
        SELECT MAX(len(split_part({{ max_field }},'.',1))) AS max_l,
               MAX(len(split_part({{ max_field }},'.',2))) AS max_r
        FROM {{ table_name }}
        )
        SELECT (max_l + max_r) || ',' || max_r AS max_total
        FROM mq
    
    {%- endcall %}
    {% if execute %}
        {%- set max_existing_total = "'" ~ load_result('cast_decimal_max').table.columns['max_total'].values()[0] ~ "'"-%}
        {{ return(max_existing_total) }}
    {% else %}
        {{ return(false) }}
    {% endif %}
    {%- endmacro %}
    

    此解决方案有效 - 用“'” ~ 包装结果并添加 if 执行语句。

    【讨论】:

      【解决方案2】:

      我无法对此进行测试,因为我无权访问 postgres 数据库(我假设您正在使用它?)。如果您在脚本中的调用中将参数放在引号中会发生什么?就这样,

      SELECT {{ cast_decimal('close_price', 'public.stable_prices') }}
      FROM public.stable_prices
      

      (对不起,这应该是评论,但还不能添加 cmets!)

      【讨论】:

      • 不幸的是,我遇到了同样的错误——是的,我正在使用 Redshift,它是 Postgres 的衍生产品。服务器错误:rpc 请求中的编译错误(来自远程系统)“无”没有属性“表”
      • @user17084215 啊,好吧,我还注意到了一件事。也许这不是问题,只是想检查一下:查看 redshift 文档,split_part 的第一个参数需要是一个字符串。但是,如果我没记错的话,您的示例(收盘价)中的第一个参数(max_field)似乎是数字?也许您想转换为字符串?我在在线测试服务器上运行了您的 max_l、max_r、max_total 查询,但它正在中断。当我将其更改为以下内容时,它可以工作,可能值得一看吗? MAX(LENGTH(SPLIT_PART(sample_col::varchar,'.',1)))
      • 我昨天就一个单独但相关的问题联系了 dbt,然后也与他们一起研究了宏。我单独发布了答案。本质上,您必须添加一个 {% if execute %} 语句并返回包含在某些字符中的结果。
      猜你喜欢
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      相关资源
      最近更新 更多