我基本上想传递一个列,然后做一个计算,自动计算我最终将作为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
(对不起,这应该是一个评论,但还不能添加评论!)