dbt宏提取列的最大len值

  • 本文关键字:len 提取 dbt dbt
  • 更新时间 :
  • 英文 :


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

我想在周期上传递一个目标列分割,计算max len()到左边,然后max len()到右边,然后返回(左+右,右)所以它是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 %}

我一直得到这个错误:'None'没有属性'table',我不确定我做错了什么。

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

SELECT {{ cast_decimal(close_price, public.stable_prices) }}
FROM public.stable_prices
{% 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 execute语句

我不能测试这个,因为我没有访问postgres数据库(我假设你正在使用?)。如果在脚本的调用中将参数放在引号中会发生什么?像这样,

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

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

相关内容

  • 没有找到相关文章

最新更新