0Pricing
Coding Interview Prep · Aula

Comparando linhas dentro de uma tabela

Use padrões de autojunção para encontrar pares, duplicatas e registros adjacentes.

Comparando linhas dentro de uma tabela é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.

SELF JOIN para comparação de linha a linha

Além das hierarquias, o outro uso principal de uma operação SELF JOIN é comparar linhas da mesma tabela entre si. Em vez da relação pai-filho, você combina linhas arbitrárias para encontrar duplicatas, correspondências aproximadas ou registros adjacentes.

O padrão é o mesmo: atribua um apelido à tabela duas vezes e escreva uma condição ON que expresse a relação entre as duas linhas que deseja combinar.

Encontrando pares no mesmo grupo

Pergunta clássica: encontre todos os pares de funcionários que trabalham no mesmo departamento. Faça a junção da tabela consigo mesma usando departamentos iguais, mas mantenha as duas linhas distintas.

A junção ingênua também combinaria cada funcionário consigo mesmo e produziria cada par duas vezes. Corrigiremos isso a seguir.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b ON a.department = b.department;

Removendo pares consigo mesmos e duplicatas espelhadas

Há dois problemas ao combinar linhas do mesmo grupo: uma linha combina consigo mesma (Alice com Alice), e cada par aparece duas vezes (Alice-Bob e Bob-Alice).

Corrija ambos com uma única desigualdade: a.id < b.id. Isso garante que as duas linhas sejam diferentes e mantém apenas uma ordem de cada par.

SELECT a.name, b.name, a.department
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.id < b.id;

Por que a.id < b.id, e não a.id <> b.id

Usar a.id <> b.id remove os pares consigo mesmos, mas ainda retorna as duas ordens, duplicando seus resultados. Usar a.id < b.id remove os pares consigo mesmos e elimina a duplicata espelhada de uma só vez.

Os entrevistadores observam especificamente a escolha entre < e <>; ela demonstra que você entende a combinatória das operações SELF JOIN.

-- <>  keeps Alice-Bob AND Bob-Alice (duplicated)
-- <   keeps only Alice-Bob (correct unique pairs)

Encontrando linhas duplicadas

Para encontrar registros que duplicam uns aos outros nas colunas-chave, faça uma operação SELF JOIN nessas colunas e exija chaves primárias diferentes.

Aqui identificamos clientes que compartilham um endereço de e-mail. O a.id < b.id mantém cada par duplicado uma única vez. Muitas vezes, um GROUP BY ... HAVING COUNT(*) > 1 é mais claro, mas a operação SELF JOIN mostra os pares problemáticos reais lado a lado.

SELECT a.id, b.id, a.email
FROM customers a
JOIN customers b
  ON a.email = b.email
 AND a.id < b.id;

Comparando registros adjacentes

Uma tarefa frequente de analistas: compare cada linha com a seguinte na sequência, por exemplo, as vendas de cada dia com as do dia anterior. Uma operação SELF JOIN pode combinar linhas consecutivas.

Aqui fazemos a junção de cada dia com a linha exatamente um dia antes para calcular uma variação. Isso funciona quando a sequência não tem lacunas.

SELECT t.day, t.amount,
       t.amount - y.amount AS change_vs_prev
FROM daily_sales t
JOIN daily_sales y
  ON y.day = t.day - INTERVAL '1 day';

O problema das lacunas em operações SELF JOIN por adjacência

A consulta anterior falha se faltar um dia: não existe uma linha exatamente um dia antes, então essa linha desaparece (junção interna) ou você precisa tratar valores NULL.

É por isso que os entrevistadores frequentemente conduzem você às funções de janela, como LAG, para 'comparar com a linha anterior': elas usam a posição ordinal em vez de uma correspondência de valores e lidam bem com lacunas.

-- LAG handles gaps; the self join assumed contiguous days
SELECT day, amount,
       amount - LAG(amount) OVER (ORDER BY day) AS change_vs_prev
FROM daily_sales;

Aut5ojunção vs Função de Janela

Conheça o equilíbrio:

  • Uma autojunção compara linhas por uma relação de valor (mesmo departamento, data anterior). É flexível, mas pode multiplicar linhas e tratar lacunas incorretamente.
  • Uma função de janela compara pela posição ordinal dentro de uma partição ordenada. É mais clara para a lógica de linha anterior/próxima.

Para 'comparar com a linha adjacente', prefira LAG/LEAD. Para 'encontrar todos os pares que correspondem a uma condição', a autojunção é a ferramenta natural.

Encontrando Linhas que Superam seus Pares

Outro padrão: encontrar funcionários que ganham mais do que pelo menos um colega no departamento. Uma autojunção expressa isso diretamente.

Fazemos a junção de cada funcionário com outros do mesmo departamento que ganham menos e mantemos os funcionários distintos que aparecem. Isso se lê quase como a frase em inglês.

SELECT DISTINCT a.name, a.department, a.salary
FROM employees a
JOIN employees b
  ON a.department = b.department
 AND a.salary > b.salary;

Cuidado com a Multiplicação de Linhas

Autojunções em uma coluna não exclusiva multiplicam as linhas. Formar pares dentro de um departamento de 100 pessoas gera cerca de 100 x 100 pares candidatos antes da filtragem.

Sempre inclua o predicado de desduplicação (a.id < b.id) e adicione DISTINCT ou agrupamento quando precisar apenas das linhas participantes, não de cada par. Mencione essa atenção à multiplicação de linhas em entrevistas.

Escolhendo a Ferramenta de Comparação

Guia de decisão para comparações dentro da tabela:

  • Todos os pares correspondentes (duplicatas, combinações do mesmo grupo): autojunção com a.id < b.id.
  • Linha anterior/próxima em uma ordenação: função de janela (LAG/LEAD).
  • Comparar cada linha com uma agregação de grupo: subconsulta correlacionada ou agregação de janela.

Verificação Rápida

Você quer cada par único de produtos que compartilhe a mesma categoria, sem que nenhum produto seja emparelhado consigo mesmo e sem ordenações duplicadas.

Recapitulação: Comparando Linhas Dentro de uma Única Tabela

Principais conclusões:

  • Faça uma autojunção da tabela para emparelhar suas próprias linhas ao encontrar duplicatas e combinações do mesmo grupo.
  • Use a.id < b.id para eliminar auto-pares e duplicatas espelhadas em um único predicado.
  • Comparações de adjacência com autojunção falham quando há lacunas; prefira LAG/LEAD para a lógica de linha anterior/próxima.
  • Sempre leve em conta a multiplicação de linhas ao fazer junções em colunas não exclusivas.

Perguntas Frequentes

A aula “Comparando linhas dentro de uma tabela” é grátis?

Sim — o texto completo de “Comparando linhas dentro de uma tabela” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.

O que vou aprender em “Comparando linhas dentro de uma tabela”?

Use padrões de autojunção para encontrar pares, duplicatas e registros adjacentes. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Comparando linhas dentro de uma tabela”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Coding Interview Prep?

Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. CROSS JOIN e produtos cartesianos
  2. SELF JOIN para hierarquias
  3. Comparando linhas dentro de uma tabela
  4. Escolhendo o tipo correto de junção
← Voltar para Coding Interview Prep