Как использовать макрос после другого макроса dbt в том же sql

Я совсем новый пользователь 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 в централизованной таблице snowflake
Как регистрировать все результаты тестов DBT в централизованной таблице snowflake
DBT имеет множество встроенных функций для автоматизации трудоемкой работы. Одной из таких функций является тест DBT.
0
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 %}

Дополнительное примечание. Это не совсем логика, которую вы хотели бы поместить в макросы. Макросы представляют ваше преобразование и, вероятно, не будут использоваться повторно (вы должны просто использовать ссылку на этот макрос, если он вам нужен в другом месте). Если этот код не намного больше, чем то, что показано для публикации вопроса, я бы просто поместил логику макроса непосредственно в модель.

Adam Kipnis 18.04.2023 17:23

первый макрос используется во многих источниках для сбора только последней записи одного и того же идентификатора, но когда он запускается, он всегда возвращается как представление с добавленным в него столбцом row_number. С ответом первого макроса в качестве представления я подумал, что применив к нему второй макрос, чтобы выбрать все столбцы, кроме добавленного row_number. Оба макроса будут использоваться в других источниках для получения последних записей с одним и тем же идентификатором, а также для исключения некоторых других столбцов :)

Nicholas Andrade 19.04.2023 17:34

Дело в том, что я пытаюсь применить второй макрос в результате первого

Nicholas Andrade 19.04.2023 17:35

Другие вопросы по теме