0Pricing
SQL Interview Prep · Aula

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 SQL 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 SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL 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-1

Exemplo 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 SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL 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 SQL 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 SQL Interview Prep?

Nenhuma experiência prévia é necessária. SQL 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 SQL Interview Prep?

Sim. Cada aula de SQL 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 SQL Interview Prep