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.idpara eliminar auto-pares e duplicatas espelhadas em um único predicado. - Comparações de adjacência com autojunção falham quando há lacunas; prefira
LAG/LEADpara 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
- CROSS JOIN e produtos cartesianos
- SELF JOIN para hierarquias
- Comparando linhas dentro de uma tabela
- Escolhendo o tipo correto de junção