Enésimo maior valor com DENSE_RANK
Generalize para o enésimo valor distinto e trate duplicatas.
Enésimo maior valor com DENSE_RANK é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 2 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.
Generalização para o N-ésimo maior
Depois que você consegue encontrar o segundo maior salário, os entrevistadores logo perguntam: "Agora me dê o N-ésimo maior." A resposta mais limpa e fácil de justificar usa DENSE_RANK.
O padrão é sempre o mesmo: classificar os salários distintos em ordem decrescente e depois filtrar a linha cuja classificação seja igual a N. Como a lógica não muda conforme N, essa única abordagem responde a toda a família de perguntas.
Vamos construir a solução, lidar com empates e duplicidades e explicar por que DENSE_RANK é a função de classificação correta para a semântica de "valor distinto".
O modelo principal
Aqui está o modelo reutilizável para o N-ésimo maior. Substitua a constante pelo valor de N solicitado pelo entrevistador.
Você calcula DENSE_RANK em uma consulta interna (a função de janela não pode ser usada em WHERE) e depois filtra externamente por rnk = N. Para o terceiro maior salário, defina o filtro como rnk = 3.
SELECT salary AS nth_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 3;Como DENSE_RANK numera valores distintos
DENSE_RANK atribui a mesma classificação a valores iguais e nunca deixa uma lacuna depois deles. Essa é exatamente a definição de "N-ésimo valor distinto" que os entrevistadores têm em mente.
Para os salários 800, 800, 600, 600, 400:
- 800 -> classificação 1
- 600 -> classificação 2
- 400 -> classificação 3
Portanto, o terceiro maior é 400, embora existam cinco linhas. As duplicidades são agrupadas automaticamente em uma única classificação.
Por que RANK dá a resposta errada
Substitua por RANK e a resposta deixa de funcionar. RANK deixa lacunas proporcionais ao número de empates.
Para 800, 800, 600, 600, 400:
- 800, 800 -> classificação 1 (duas ocorrências)
- 600, 600 -> classificação 3 (há uma lacuna, sem classificação 2)
- 400 -> classificação 5
Filtrar por rnk = 3 retorna 600, e rnk = 2 não retorna nada. A menos que o entrevistador queira especificamente uma classificação no estilo de competição, DENSE_RANK é a opção correta para o "N-ésimo salário distinto".
Por que ROW_NUMBER também está errado aqui
ROW_NUMBER atribui um número exclusivo a cada linha, ignorando completamente os empates. Para 800, 800, 600, 600, 400, ele produz 1, 2, 3, 4, 5.
Assim, rn = 3 retorna 600, mas rn = 2 retorna o 800 duplicado, não um segundo valor distinto. ROW_NUMBER responde "a N-ésima linha", não "o N-ésimo valor distinto".
Use ROW_NUMBER somente quando a pergunta realmente exigir uma linha específica, como em uma deduplicação ou ao manter exatamente uma linha por grupo no caso dos N maiores.
SELECT salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM employee;Parametrizando N com segurança
Em um código real, você não fixaria a classificação no código. Passe N como parâmetro e faça a comparação com ele. A definição da janela permanece idêntica; apenas o filtro externo é parametrizado.
É também aqui que você pode retornar todos os salários empatados na classificação N: como DENSE_RANK compartilha a classificação entre valores empatados, WHERE rnk = N pode retornar várias linhas se vários funcionários tiverem o N-ésimo salário distinto, o que geralmente é o comportamento desejado.
SELECT id, salary
FROM (
SELECT id, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = :n;A generalização da contagem correlacionada
A abordagem anterior às funções de janela também se generaliza: um salário é o N-ésimo salário distinto mais alto quando existem exatamente N - 1 salários distintos estritamente maiores que ele.
Para o terceiro maior, exija exatamente 2 salários distintos maiores. Isso funciona em mecanismos mais antigos, sem funções de janela, mas não escala bem, pois a contagem interna é executada novamente para cada linha externa.
SELECT DISTINCT salary AS nth_highest
FROM employee e
WHERE (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
) = 2;A forma de função do MySQL solicitada pelos entrevistadores
O problema do LeetCode do tipo "N-ésimo maior salário" geralmente pede uma função armazenada que retorne um único valor. O corpo é simplesmente o modelo com DENSE_RANK adaptado para retornar um salário.
Você não precisa memorizar a sintaxe exata de uma função durante uma entrevista, mas vale a pena saber que LIMIT N-1, 1 sobre salários distintos é a forma concisa e idiomática do MySQL.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2; -- N = 3, so OFFSET N-1Exemplo resolvido: quarto maior
Salários: 1000, 900, 900, 700, 500, 500, 300.
Valores distintos em ordem decrescente com DENSE_RANK:
- 1000 -> 1
- 900 -> 2
- 700 -> 3
- 500 -> 4
- 300 -> 5
O quarto maior é 500. Observe que as duas linhas com 500 compartilham a classificação 4; portanto, filtrar por rnk = 4 retorna ambos os funcionários que ganham 500 se você também selecionar os identificadores deles.
Observações sobre desempenho
Como as abordagens se comparam em grande escala?
- DENSE_RANK: uma ordenação dos dados e, depois, um filtro. É eficiente, e o planejador pode usar um índice sobre o salário para fazer a ordenação.
- Contagem correlacionada: potencialmente O(n²), pois a agregação interna é executada para cada linha. Evite-a em tabelas grandes.
- LIMIT/OFFSET: rápido para valores pequenos de N, mas ainda precisa ordenar; além disso, grandes deslocamentos percorrem e descartam muitas linhas.
Comece com DENSE_RANK e raramente você errará.
Casos-limite a mencionar
Bons candidatos mencionam os casos-limite antes de serem questionados:
- N maior que a quantidade de salários distintos: o filtro não encontra nenhuma linha e retorna um resultado vazio. A lição 4 explica como forçar um único
NULL. - Empates na classificação N: DENSE_RANK retorna todos os funcionários empatados; decida se esse é o comportamento desejado.
- N = 1: o modelo continua funcionando e retorna o máximo.
Verificação rápida
Aplique o modelo do N-ésimo maior.
Recapitulação
Para o N-ésimo maior salário, há uma resposta padrão: classifique os salários distintos com DENSE_RANK() OVER (ORDER BY salary DESC) em uma subconsulta e depois filtre por WHERE rnk = N.
- DENSE_RANK representa o "N-ésimo valor distinto", com os valores empatados compartilhando uma classificação e sem lacunas.
- RANK introduz lacunas; ROW_NUMBER conta linhas, não valores.
- O truque da contagem correlacionada = N-1 generaliza a mesma ideia sem funções de janela, mas não escala bem.
Sempre destaque o caso-limite "N excede os valores disponíveis", que resolveremos a seguir.
Perguntas Frequentes
A aula “Enésimo maior valor com DENSE_RANK” é grátis?
Sim — o texto completo de “Enésimo maior valor com DENSE_RANK” é 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 “Enésimo maior valor com DENSE_RANK”?
Generalize para o enésimo valor distinto e trate duplicatas. 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 2 de 4.
Quanto tempo leva a aula “Enésimo maior valor com DENSE_RANK”?
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