From 7e3e818c8efa258c400e7c981a9fe1027e4d32b9 Mon Sep 17 00:00:00 2001 From: Murillo Nardi <125933646+murillonardi@users.noreply.github.com> Date: Tue, 25 Nov 2025 08:55:30 -0300 Subject: [PATCH] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Query para criação da tabela de touchpoints para ZAP Imóveis --- marketing_attribution_models/README.txt | 16 ++++ .../mta_zap_attribution_skeleton.sql | 94 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 marketing_attribution_models/README.txt create mode 100644 marketing_attribution_models/mta_zap_attribution_skeleton.sql diff --git a/marketing_attribution_models/README.txt b/marketing_attribution_models/README.txt new file mode 100644 index 0000000..7c6654c --- /dev/null +++ b/marketing_attribution_models/README.txt @@ -0,0 +1,16 @@ +Descrição das CTE’s + +events_base: query que puxa diversas colunas da tabela bruta do GA4 e realiza alguns tratamentos para desaninhar campos em formato RECORD e também para deduplicar e ordenar eventos que são disparados por cada usuário. + +leads: CTE que filtra somente os eventos de conversão “generate_lead” de cada usuário (utilizando como base o user_pseudo_id, por enquanto). Isso é feito através da regra “is_conversion”, que retorna um valor booleano que identifica se o evento em cada linha da CTE “events_base” é uma conversão ou não. + +touchpoints: une os dados de eventos de cada usuário e os relaciona com os dados de geração de lead através do user_pseudo_id. + + +Colunas Essenciais + +lead_timestamp - define o momento exato em que o evento generate_lead foi coletado. esta coluna é utilizada para calcular os valores na coluna days_to_lead. + +lead_sequence - Ajuda a distinguir leads em sequência do mesmo usuário e definir o fim de cada jornada. Um mesmo usuário pode ter gerar vários leads, então esta coluna permite identificar e individualizar cada jornada, assumindo que após a geração do lead sempre consideramos que todos os eventos subsequentes daquele usuário fazem parte de uma nova jornada. + +days_to_lead - Calcula a diferença em dias entre o timestamp do evento em cada linha da tabela e o timestamp da geração do lead. \ No newline at end of file diff --git a/marketing_attribution_models/mta_zap_attribution_skeleton.sql b/marketing_attribution_models/mta_zap_attribution_skeleton.sql new file mode 100644 index 0000000..0fe118a --- /dev/null +++ b/marketing_attribution_models/mta_zap_attribution_skeleton.sql @@ -0,0 +1,94 @@ +--CTE para tratamento, desaninhamento e deduplicação dos eventos da base bruta do GA4 +WITH events_base AS ( + SELECT + CAST(event_date AS DATE FORMAT 'YYYYMMDD') AS date, + (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id, + CONCAT(user_pseudo_id, (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id')) AS session_id, + user_pseudo_id, + timestamp_micros(event_timestamp) AS event_timestamp, + event_bundle_sequence_id, + event_name, + collected_traffic_source.manual_source, + collected_traffic_source.manual_medium, + collected_traffic_source.manual_campaign_name, + collected_traffic_source.gclid, + session_traffic_source_last_click.google_ads_campaign.campaign_name as gads_campaign_name, + session_traffic_source_last_click.dv360_campaign.campaign_name as dv360_campaign_name, + session_traffic_source_last_click.sa360_campaign.campaign_name as sa360_campaign_name, + session_traffic_source_last_click.cm360_campaign.campaign_name as cm360_campaign_name, + 'zapimoveis' AS brand, + geo.country AS country, + geo.region AS state, + geo.city AS city, + platform, + device.category AS device, + COALESCE((SELECT IFNULL(value.string_value, CAST(value.int_value AS STRING)) FROM UNNEST(event_params) WHERE key = 'main_category'),'(not set)') AS main_category, + COALESCE((SELECT IFNULL(value.string_value, CAST(value.int_value AS STRING)) FROM UNNEST(event_params) WHERE key = "main_category_id" ),'(not set)') AS main_category_id, + COALESCE((SELECT IFNULL(value.string_value, CAST(value.int_value AS STRING)) FROM UNNEST(event_params) WHERE key = 'sub_category' ),'(not set)') AS sub_category, + COALESCE((SELECT IFNULL(value.string_value, CAST(value.int_value AS STRING)) FROM UNNEST(event_params) WHERE key = "sub_category_id" ),'(not set)') AS sub_category_id, + (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'content_group') AS content_group, + (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'reply_type') AS reply_type, + (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'lead_category') AS lead_category, + (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'lead_type') AS lead_type, + --Mecanismo de deduplicação + ROW_NUMBER() OVER (PARTITION BY event_timestamp, event_name, user_pseudo_id) AS row_num, + --Identificação do evento de conversão + CASE WHEN event_name = 'generate_lead' THEN 1 ELSE 0 END AS is_conversion + FROM + `mkt-data-analytics.analytics_407374944.events_*` + WHERE + _TABLE_SUFFIX BETWEEN '20251101' AND '20251107' + +), + +-- CTE que identifica todos os eventos de conversão e o momento em que ocorreram. +leads AS ( + SELECT + user_pseudo_id, + event_timestamp AS lead_timestamp, + --Identificação da ordem de cada lead gerado pelo usuário, assumindo que um usuário pode gerar mais de um lead. + ROW_NUMBER() OVER (PARTITION BY user_pseudo_id ORDER BY event_timestamp) AS lead_sequence + FROM + events_base + WHERE + is_conversion = 1 + AND row_num = 1 +), + +-- Junta os eventos (touchpoints) com o lead subsequente mais próximo +touchpoints AS ( + SELECT + t1.* EXCEPT(row_num), + t2.lead_timestamp, + t2.lead_sequence, + -- Calcula a diferença de tempo (em dias) entre o touchpoint e o lead + TIMESTAMP_DIFF(t2.lead_timestamp, t1.event_timestamp, DAY) AS days_to_lead + FROM + events_base AS t1 + INNER JOIN + leads AS t2 + USING(user_pseudo_id) + WHERE + t1.row_num = 1 + -- Garante que o touchpoint ocorreu antes ou no momento da geração do lead + AND t1.event_timestamp <= t2.lead_timestamp + -- Seleciona o lead subsequente mais próximo para cada evento + AND t2.lead_sequence = ( + SELECT MIN(lead_sequence) + FROM leads + WHERE user_pseudo_id = t1.user_pseudo_id + AND lead_timestamp >= t1.event_timestamp + ) +) +-- Consulta final aplicando a janela de lookback de 7 dias e a criação da coluna de canal +SELECT + *, + -- Placeholder para agrupamento de canais que será definido posteriormente + 'placeholder' AS channel_grouping +FROM + touchpoints +WHERE + -- Filtra para incluir apenas touchpoints dentro da janela de 7 dias (incluindo o próprio lead, onde days_to_lead = 0) + days_to_lead <= 7 +ORDER BY + user_pseudo_id, lead_sequence, event_timestamp \ No newline at end of file