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 1ignora o maior salário.LIMIT 1manté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_NUMBERatribui 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.RANKdeixa 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_RANKatribui 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
NULLquando 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
NULLautomaticamente. - 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_NUMBERem vez deDENSE_RANKe obter o maior salário duas vezes. - Esquecer
DISTINCTna versão com LIMIT/OFFSET quando existem máximos duplicados. - Presumir que
ORDER BY salary DESC LIMIT 1,1retorna 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
NULLautomaticamente. - 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
- Segundo maior salário: cinco maneiras
- Enésimo maior valor com DENSE_RANK
- Maior salário por departamento
- Retornando NULL quando não existe o enésimo valor