0Pricing
Coding Interview Prep · Aula

Segundo maior salário: cinco maneiras

Compare soluções com subconsulta, LIMIT/OFFSET e funções de janela.

Segundo maior salário: cinco maneiras é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 1 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.

A pergunta que todos recebem

"Encontre o segundo maior salário" é a pergunta de entrevista de SQL mais frequente. Os entrevistadores gostam dela porque há várias respostas corretas e diversas armadilhas sutis.

Considere uma tabela employee com as colunas id e salary. Sua tarefa é retornar o segundo valor de salário distinto.

  • Se os salários forem 300, 200, 200, 100, a resposta será 200, não a segunda linha.
  • Se não houver um segundo salário distinto, a resposta esperada geralmente será NULL.

Nas próximas cenas, resolveremos isso de cinco maneiras diferentes e discutiremos em que situação cada uma se destaca.

CREATE TABLE employee (
  id     INT PRIMARY KEY,
  salary INT
);

Maneira 1: MAX dos valores abaixo do MAX

A solução mais intuitiva: o segundo maior salário é o maior salário estritamente menor que o máximo geral.

Isso é quase autoexplicativo e funciona em qualquer dialeto de SQL. A subconsulta interna encontra o maior valor, e o MAX externo encontra o maior valor abaixo dele.

Bônus: se não houver um segundo salário distinto, o MAX externo agrega zero linhas e retorna NULL automaticamente. Esse NULL obtido sem esforço é exatamente o que os entrevistadores esperam.

SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);

Por que a subconsulta lida com duplicidades

Observe que nunca usamos DISTINCT na Forma 1, mas as duplicidades são tratadas corretamente.

Se três pessoas ganham 200 e a pessoa com o maior salário ganha 300, a consulta interna retorna 300. O filtro externo mantém todas as linhas abaixo de 300, e o MAX dessas linhas é 200, independentemente de quantos valores 200 existam.

Esta é a ideia principal: as agregações eliminam as duplicidades por você. Muitos candidatos complicam excessivamente a solução com DISTINCT, embora a agregação já produza o resultado correto.

Forma 2: LIMIT com OFFSET

No MySQL e no PostgreSQL, você pode ordenar os salários distintos em ordem decrescente e ignorar o primeiro.

  • OFFSET 1 ignora o maior salário.
  • LIMIT 1 mantém apenas o próximo.

DISTINCT é essencial aqui; caso contrário, salários máximos duplicados fariam OFFSET 1 parar em uma repetição do máximo, em vez de chegar ao verdadeiro segundo maior.

Armadilha: se não houver um segundo valor distinto, isso retorna zero linhas, não NULL. Vamos corrigir esse caso-limite na lição 4.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;

Forma 3: FETCH para SQL Server e Oracle

O SQL Server e as versões modernas do Oracle não aceitam LIMIT ... OFFSET. Em vez disso, usam a sintaxe padrão ANSI OFFSET ... FETCH.

A lógica é idêntica à da Forma 2: ordenar os salários distintos em ordem decrescente, ignorar uma linha e buscar uma. Conhecer a sintaxe usada em diferentes dialetos demonstra experiência prática ao entrevistador.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

Forma 4: função de janela DENSE_RANK

A abordagem moderna e escalável usa uma função de janela. DENSE_RANK atribui a classificação 1 ao maior salário, a classificação 2 ao próximo salário distinto e atribui a mesma classificação aos salários empatados, sem lacunas.

Calculamos a classificação em uma subconsulta e depois filtramos pela classificação 2 na consulta externa. Lembre-se: não é possível filtrar diretamente por uma função de janela em WHERE, portanto o encapsulamento em uma subconsulta é obrigatório.

SELECT salary AS second_highest
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) ranked
WHERE rnk = 2;

Por que usar DENSE_RANK, e não RANK ou ROW_NUMBER

A escolha da função de classificação é importante para a semântica de valores distintos:

  • ROW_NUMBER atribui um número exclusivo a cada linha; assim, duas pessoas que ganham 300 seriam as linhas 1 e 2, e a classificação 2 seria uma repetição do maior salário. Incorreto.
  • RANK deixa lacunas depois de empates: dois salários 300 recebem a classificação 1, e o próximo salário passa diretamente para a classificação 3. Você o perderia na classificação 2. Incorreto.
  • DENSE_RANK atribui a mesma classificação aos valores empatados e não deixa lacunas; assim, a classificação 2 é sempre o segundo salário distinto. Correto.

Forma 5: contagem em subconsulta correlacionada

Uma técnica clássica, anterior às funções de janela: um salário é o N-ésimo maior se houver exatamente N-1 salários distintos estritamente maiores que ele.

Para o segundo maior, queremos exatamente um salário distinto acima dele. A ideia é elegante, mas pode ser lenta em tabelas grandes, pois a contagem interna é executada para cada linha externa.

Ela se generaliza facilmente para o N-ésimo maior, bastando alterar a contagem para N - 1, e é por isso que os entrevistadores gostam de vê-la.

SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
  SELECT COUNT(DISTINCT e2.salary)
  FROM employee e2
  WHERE e2.salary > e.salary
);

Um exemplo completo, do início ao fim

Considere os salários: 500, 500, 350, 350, 100.

  • Forma 1: MAX é 500, e o maior valor abaixo de 500 é 350. A resposta é 350.
  • Forma 4 (DENSE_RANK): 500 -> classificação 1, 350 -> classificação 2, 100 -> classificação 3. A classificação 2 é 350.
  • Forma 5: para o salário 350, há exatamente um salário distinto (500) maior. Há correspondência. A resposta é 350.

Os cinco métodos concordam: o segundo salário distinto mais alto é 350, mesmo com duplicidades presentes.

Qual deles você deve escolher

Orientação para entrevistas:

  • Declare primeiro a pergunta: "Você quer salários distintos e NULL quando nenhum existir?" Esclarecer os requisitos rende pontos.
  • DENSE_RANK é a resposta padrão mais sólida; ele se generaliza de forma simples para o N-ésimo maior e para cada grupo.
  • MAX abaixo de MAX é a melhor solução de uma linha e retorna NULL automaticamente.
  • LIMIT/OFFSET é conciso, mas específico de cada dialeto e não retorna linhas no caso-limite.

Mencionar as vantagens e desvantagens em voz alta é o que diferencia uma resposta de nível intermediário de uma resposta de iniciante.

Erros comuns a evitar

Fique atento a estas armadilhas preparadas pelos entrevistadores:

  • Usar ROW_NUMBER em vez de DENSE_RANK e obter o maior salário duas vezes.
  • Esquecer DISTINCT na versão com LIMIT/OFFSET quando existem máximos duplicados.
  • Presumir que ORDER BY salary DESC LIMIT 1,1 retorna um valor distinto (não retorna).
  • Retornar a segunda linha em vez do segundo valor.

Verificação rápida

Teste sua compreensão sobre a escolha da função de classificação.

Recapitulação

Agora você conhece cinco maneiras de encontrar o segundo maior salário:

  • MAX abaixo de MAX - portável e retorna NULL automaticamente.
  • LIMIT/OFFSET e OFFSET/FETCH - concisos e específicos de cada dialeto.
  • DENSE_RANK - a opção padrão escalável que trata os empates corretamente.
  • Contagem correlacionada - elegante e generalizável para o N-ésimo maior.

Principais conclusões: pergunte se são necessários valores distintos, prefira DENSE_RANK para lidar com empates e lembre-se de quais métodos retornam NULL em vez de nenhuma linha quando um segundo valor não existe.

Perguntas Frequentes

A aula “Segundo maior salário: cinco maneiras” é grátis?

Sim — o texto completo de “Segundo maior salário: cinco maneiras” é 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 “Segundo maior salário: cinco maneiras”?

Compare soluções com subconsulta, LIMIT/OFFSET e funções de janela. 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 1 de 4.

Quanto tempo leva a aula “Segundo maior salário: cinco maneiras”?

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. Segundo maior salário: cinco maneiras
  2. Enésimo maior valor com DENSE_RANK
  3. Maior salário por departamento
  4. Retornando NULL quando não existe o enésimo valor
← Voltar para Coding Interview Prep