Я совсем новый пользователь dbt, и мне нужна помощь с макросами.
Дело в том, что я пытаюсь выполнить макрос после другого макроса в том же SQl.
Первый макрос ищет самый последний регистр «data_modificacao» с помощью «id_produto». и вернуть его
второй макрос использует звездочку, чтобы исключить некоторые столбцы, потому что представление имеет более 60 столбцов, это дерьмо, чтобы вызывать их все время
код, который я пытаюсь применить макросы:
on Produtos_Sem_Tratamento.sql:
with
Produtos as (
{{ registros_recentes(ref('stg_Produtos'), 'id_produto', 'data_modificacao') }}
),
final as (
{{filtrar_colunas_star(ref = Produtos,"row_number")}}
)
select * from final
код первого макроса:
{% macro registros_recentes(model_name, id_column_name, time_column_name) %}
with
added_row_number as (
select
*
,row_number() over(partition by {{id_column_name}} order by {{time_column_name}} desc) as row_number
from {{ model_name }}
),
first_register as (
select
*
from added_row_number
where row_number = 1
)
select * from first_register
{% endmacro %}
второй код макроса:
{% macro filtrar_colunas_star(model_name, column_name) %} /* column_name é o nome da coluna da 'chave_altoqi' */
{%- set columns = dbt_utils.star(from=model_name, except=[column_name]) -%}
with
colunas_filtradas as (
select {{columns}}
from {{model_name}}
)
select * from colunas_filtradas
{% endmacro %}
Может ли кто-нибудь помочь мне с этим?
журнал ошибок такой:
Compilation Error in model Produtos_Sem_Tratamento (models\marts\Zoho\basic\Produtos_Sem_Tratamento.sql)
Macro star expected a Relation but received the value: Produtos
dbt_utils.star()
не работает на CTE. Работает только на Relation
. В вашем случае все, что вы делаете, это отфильтровываете столбец row_number
, который вы добавили в первом CTE, к исходному ref
. Вы можете просто передать Relation
из модели во второй макрос так же, как и в первом.
Вы не отфильтровываете какие-либо столбцы из исходной ссылки, поэтому вам даже не нужен параметр except
. Но я оставил его ниже, чтобы пример соответствовал коду в вашем вопросе. Вы получите тот же результат, если уберете его.
{% set src_rel = ref('stg_Produtos') %}
with
Produtos as (
{{ registros_recentes(src_rel, 'id_produto', 'data_modificacao') }}
),
final as (
{{filtrar_colunas_star('Productos', "row_number", src_rel)}}
)
select * from final
{% macro filtrar_colunas_star(model_name, column_name, src_ref) %} /* column_name é o nome da coluna da 'chave_altoqi' */
{%- set columns = dbt_utils.star(from=src_ref, except=[column_name]) -%}
with
colunas_filtradas as (
select {{columns}}
from {{model_name}}
)
select * from colunas_filtradas
{% endmacro %}
первый макрос используется во многих источниках для сбора только последней записи одного и того же идентификатора, но когда он запускается, он всегда возвращается как представление с добавленным в него столбцом row_number. С ответом первого макроса в качестве представления я подумал, что применив к нему второй макрос, чтобы выбрать все столбцы, кроме добавленного row_number. Оба макроса будут использоваться в других источниках для получения последних записей с одним и тем же идентификатором, а также для исключения некоторых других столбцов :)
Дело в том, что я пытаюсь применить второй макрос в результате первого
Дополнительное примечание. Это не совсем логика, которую вы хотели бы поместить в макросы. Макросы представляют ваше преобразование и, вероятно, не будут использоваться повторно (вы должны просто использовать ссылку на этот макрос, если он вам нужен в другом месте). Если этот код не намного больше, чем то, что показано для публикации вопроса, я бы просто поместил логику макроса непосредственно в модель.