Pular para o conteúdo

Agregação e joins visuais

Aula 9 de 128 minOperarAtualizada em 2026-10-04

Vídeo em produção

A gravação desta aula está no lote de produção. O objetivo, o exercício e a documentação já valem. Duração-alvo: 8 min.

Objetivo: Construir Gold agregado sem fan-out

Selo de estado: Preview (teto atual do produto) · Curso ACD-220 — Pipelines e medalhão Bronze/Silver/Gold · Aula 9 de 12 · Atualizado em 2026-10-04.

Objetivo#

Ao final desta aula você vai construir Gold agregado sem fan-out — agrupar, cruzar tabelas declarando a cardinalidade e entender por que o produto bloqueia um cruzamento que multiplicaria suas linhas.

Vídeo#

Identificador no manifesto: acd-220-09-group-by-e-joins-sem-fan-out · duração-alvo 8 min · tela do produto: /sources.

Roteiro de gravação (5 capítulos):

#Minutagem-alvoCapítuloTela do produto
10:00–0:45Abertura: título + selo. O defeito clássico: "a receita triplicou e ninguém mexeu no dado"./sources
20:45–2:40Passo agrupar: chaves (a ordem é a ordem de saída), as seis agregações e os nomes de saída./sources
32:40–4:40Passo juntar: segunda tabela, modo esquerda/interna, chaves do ON, lista de colunas do lado direito./sources
44:40–6:40Cardinalidade esperada e o bloqueio de fan-out: a mensagem com a venda de 3 itens; quando aprovar explicitamente./sources
56:40–8:00Montar gold.vendas_mensal_filial e conferir o total contra a Silver; encerramento com o "faça você mesmo"./dados

Conteúdo#

Um cruzamento errado não dá erro — dá número errado

Cruzar vendas com uma tabela que tem várias linhas por venda multiplica as suas linhas: uma venda com 3 itens vira 3 linhas, e soma(receita) triplica. Nenhum banco reclama disso. É por isso que o produto pede a cardinalidade esperada e bloqueia o cruzamento perigoso em vez de deixar você descobrir no painel.

agrupar: as chaves e as seis agregações

O passo agrupar tem duas partes:

  • chaves — as colunas do agrupamento. A ordem é semântica: é a ordem das colunas de saída. Lista vazia = agregação global (uma linha só, sem agrupamento) — é assim que se monta um mart de KPI.
  • agregações — uma ou mais, e a ordem define a ordem das colunas de saída.
AgregaçãoO que fazObservação
somaSoma a colunaInfla com fan-out
mediaMédia da colunaInfla com fan-out
contagemConta linhas; sem coluna = contar todas as linhasInfla com fan-out
contagem_distintaConta valores distintosSegura sob fan-out
min / maxMenor / maior valorSeguras sob fan-out

Cada agregação pode receber um nome de saída. Sem nome, ele é derivado (soma_valor, contagem). Um nome informado por você é validado como identificador simples — nunca reescrito em silêncio.

juntar: o que você declara ao cruzar

CampoO que significa
segunda tabelaA tabela do cruzamento. Sempre do mesmo workspace — os guards do datalake exigem o prefixo do tenant também nela
modoesquerda (mantém todas as suas linhas) ou interna (mantém só as que casam)
chavesO ON, com um ou mais pares: minha coluna = coluna dela
colunasA lista permitida do lado direito, na ordem de saída. Ausente = todas as colunas dela menos as chaves do ON
cardinalidade esperada1-1, N-1, 1-N ou N-N, do ponto de vista das suas linhas

Quando uma coluna do lado direito colide com uma chave sua, ela sai prefixada t2_ — regra estática, porque o SQL não pode depender do schema do momento.

A prevenção de fan-out, em três regras

A cardinalidade é declarada por você; a validação é estática e fail-closed:

  1. 1-1 e N-1 passam sem aviso: o lado direito não multiplica suas linhas.
  2. 1-N e N-N são bloqueadas quando o pipeline não agrupa depois, ou quando o agrupar seguinte usa soma, media ou contagem sobre coluna que não é provadamente do lado direito do cruzamento. Dois casos específicos:
    • contagem sem coluna conta linhas — e linhas multiplicadas inflam a contagem. Para contar registros únicos, use contagem_distinta.
    • Se o cruzamento não listou as colunas do lado direito, nenhuma coluna é provadamente direita (é o fail-closed): liste as colunas ou aprove explicitamente.
  3. Aprovação explícita libera, com aviso — nunca em silêncio.

A mensagem que o produto mostra é literal, e vale ler com calma: "este cruzamento pode multiplicar suas linhas (1-N): uma venda com 3 itens viraria 3 linhas e a soma de receita triplicaria. … Se é isso que você quer, marque 'aprovar multiplicação'."

E um lembrete honesto: a validação é estática. Ela confere o que você declarou, não o que a sua tabela tem hoje. A verificação empírica (contar linhas antes e depois) é trabalho da execução paralela de conferência — o que nos leva à aula 11. Declarar N-1 numa relação que na verdade é 1-N passa pela validação e dá número errado: a conferência contra a Silver é obrigatória.

Exemplo: a Comércio Aurora

Maria quer gold.vendas_mensal_filial (receita e pedidos por mês e filial):

código
1) datas: data_pedido → truncar_mes          (cria o mês)
2) juntar: filiais, modo esquerda,
   chaves: filial_id = id,
   colunas: [nome, uf, regiao],
   cardinalidade esperada: N-1               (muitas vendas, uma filial)
3) agrupar: chaves [mes, nome, uf],
   agregações: soma(valor) → receita,
               contagem_distinta(pedido_id) → pedidos

O cruzamento é N-1: passa sem aviso. Se ela acrescentasse itens_venda (várias linhas por venda) com cardinalidade 1-N e mantivesse soma(valor) sobre a coluna de vendas, o passo seria bloqueado com a mensagem da venda de 3 itens. A saída correta nesse caso é agrupar antes de cruzar, ou somar a coluna do lado direito (soma(item_valor)), ou aprovar a multiplicação sabendo o que está fazendo.

Depois de rodar, Maria confere: SOMA(receita) de gold.vendas_mensal_filial tem de dar exatamente a soma de valor na Silver de vendas. Se não der, é fan-out — não é "arredondamento".

Erros comuns

SintomaCausa provávelO que fazer
A receita do Gold é múltipla da SilverFan-out: cruzamento com várias linhas por vendaAgrupe antes de cruzar, ou some a coluna do lado direito
O passo juntar foi bloqueado1-N/N-N sem agrupamento seguro depoisReveja a cardinalidade real; liste as colunas do lado direito
"não dá para garantir que ela vem do lado cruzado"O cruzamento não listou as colunas (fail-closed)Informe a lista de colunas do lado direito
A contagem de pedidos ficou infladacontagem sem coluna conta linhasUse contagem_distinta sobre a chave do pedido
Apareceu uma coluna t2_filial_idColisão de nome com uma chave suaÉ a regra de prefixo; renomeie na saída se incomodar
O mart ficou com uma linha sóagrupar sem chaves = agregação globalInforme as chaves — ou era isso que você queria (mart de KPI)
Declarei N-1 e o número continua erradoA relação real é 1-NA validação é estática: confira o total contra a Silver

O que é Preview aqui

O agrupamento, os joins e a prevenção de fan-out consciente de grão são provados por teste determinístico (C04.5 = GA-candidato). A verificação empírica de cardinalidade e a materialização real em BigQuery dependem de execução em nuvem — Preview. Nada aqui é "GA".

Faça você mesmo#

No workspace de treino Aurora Varejo, construindo gold.vendas_mensal_filial sobre a Silver de vendas e filiais.

  1. Em /sources, etapa Transformações, crie a tabela Gold a partir da Silver de vendas.
  2. Acrescente datas: data_pedido → truncar_mes para criar a coluna de mês.
  3. Acrescente juntar com filiais: modo esquerda, chave filial_id = id, colunas [nome, uf, regiao], cardinalidade esperada N-1. Confirme que não aparece aviso de multiplicação.
  4. Acrescente agrupar: chaves [mes, nome, uf]; agregações soma(valor) com nome receita e contagem_distinta(pedido_id) com nome pedidos.
  5. Agora provoque o bloqueio: mude a cardinalidade do cruzamento para 1-N e tente salvar. Leia a mensagem inteira e anote o motivo.
  6. Troque contagem_distinta(pedido_id) por contagem sem coluna (ainda em 1-N) e leia a segunda mensagem — ela é diferente.
  7. Volte para N-1 com contagem_distinta, publique e rode.
  8. No Console de dados, compare SOMA(receita) do mart Gold com a soma de valor na Silver de vendas. Os números têm de ser iguais.

Você terminou quando gold.vendas_mensal_filial existe com receita e pedidos por mês e filial, o total do Gold bate exatamente com a Silver, e você provocou e leu duas mensagens diferentes de prevenção de fan-out.

Checagem rápida#

Três perguntas no final da aula, corrigidas no servidor. A aula só conta como concluída depois da checagem.

Documentação relacionada#

Capacidades ensinadas#

C04.5 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".

Carregando seu progresso…