Ir para o conteúdo
ChatRound
  1. ChatRound
  2. Exemplos
  3. Código

Os 3 maiores salários por departamento, com empates: o SQL de uma IA, revisado

Gemini 2.5 Flash-Lite escreveu uma consulta com DENSE_RANK(). As duas revisões a consideram correta e só acrescentam avisos sobre NULL e versões de banco.

ExemploA resposta abaixo foi escrita para esta página pelo Gemini 2.5 Flash-Lite, pela API da Google e sem busca na web. Ela não vem da conversa de ninguém. O ChatRound a revisou em 27 de outubro de 2026.Os revisores são os dois modelos que o ChatRound escolhe por padrão para uma resposta dessa empresa.

Resposta do Gemini 2.5 Flash-Lite Escreva uma consulta SQL na tabela employees(id, name, department_id, salary) que liste todas as pessoas que recebem um dos 3 maiores salários do seu departamento. Se várias pessoas tiverem o mesmo salário, todas devem aparecer.
WITH RankedSalaries AS (
    SELECT
        id,
        name,
        department_id,
        salary,
        DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as salary_rank
    FROM
        employees
)
SELECT
    id,
    name,
    department_id,
    salary
FROM
    RankedSalaries
WHERE
    salary_rank <= 3
ORDER BY
    department_id, salary DESC;

Explicação:

  1. WITH RankedSalaries AS (...): Esta é uma Common Table Expression (CTE), que nos permite criar um conjunto de resultados temporário com um nome (RankedSalaries). Isso torna a consulta mais legível e organizada.

  2. SELECT id, name, department_id, salary, DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as salary_rank FROM employees:

    • Selecionamos todas as colunas da tabela employees.
    • DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC): Esta é a parte crucial.
      • DENSE_RANK(): É uma função de janela que atribui uma classificação a cada linha dentro de uma partição. Ao contrário do RANK(), o DENSE_RANK() não pula números em caso de empates. Por exemplo, se dois funcionários tiverem o maior salário, ambos receberão a classificação 1, e o próximo funcionário (mesmo que com um salário diferente) receberá a classificação 2.
      • OVER (...): Indica que esta é uma função de janela.
      • PARTITION BY department_id: Divide os dados em partições com base no department_id. Isso significa que a classificação de salário será calculada independentemente para cada departamento.
      • ORDER BY salary DESC: Dentro de cada partição (departamento), ordena os funcionários pelo salary em ordem decrescente (do maior para o menor).
      • as salary_rank: Renomeamos a coluna resultante da função DENSE_RANK() para salary_rank.
  3. SELECT id, name, department_id, salary FROM RankedSalaries WHERE salary_rank <= 3:

    • Selecionamos as colunas desejadas do nosso conjunto de resultados temporário RankedSalaries.
    • WHERE salary_rank <= 3: Filtramos as linhas para incluir apenas aquelas onde o salary_rank é menor ou igual a 3. Isso garante que estamos pegando os 3 maiores salários (ou mais, se houver empates).
  4. ORDER BY department_id, salary DESC:

    • Finalmente, ordenamos os resultados. Primeiro, por department_id para agrupar os funcionários de cada departamento juntos, e depois por salary em ordem decrescente dentro de cada departamento, para ver os salários mais altos primeiro.

Por que usar DENSE_RANK() em vez de RANK() ou ROW_NUMBER()?

  • DENSE_RANK(): É a escolha correta porque garante que, se houver empates no salário, todos os funcionários com o mesmo salário receberão a mesma classificação, e a próxima classificação será a próxima na sequência. Isso é exatamente o que você quer para "recebem um dos 3 maiores salários". Se houver 3 funcionários com o mesmo salário mais alto, todos eles serão classificados como 1, e você os incluirá. Se houver dois funcionários com o maior salário e um com o segundo maior, eles serão classificados como 1, 1, 2, e você os incluirá.

  • RANK(): Se houver empates, ele pula classificações. Por exemplo, se dois funcionários forem 1º, o próximo será 3º. Isso poderia fazer com que você perdesse o terceiro salário mais alto se houvesse muitos empates no topo.

  • ROW_NUMBER(): Atribui um número sequencial único a cada linha, mesmo em caso de empates. Isso significa que você teria um número diferente para cada funcionário, mesmo que tivessem o mesmo salário, e não atenderia ao requisito de incluir todos que compartilham o mesmo salário.

Pode confiar: a consulta está correta; faltam apenas observações sobre compatibilidade do SGBD, valores NULL e quantidade variável de resultados.

  • 0 errados
  • 0 em disputa
  • 4 corretos
  • 2 faltando

Revisada por DeepSeek V4.1 Flash e Claude Haiku 4.5 · Relatório escrito por GPT-5.6 Luna

Os revisores não encontraram nada errado nesta resposta.

O restante

O que se sustenta4 pontos ▾
  • DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) calcula corretamente os três maiores valores salariais por departamento.
  • WHERE salary_rank <= 3 inclui todas as pessoas empatadas em qualquer um dos três maiores salários.
  • A explicação sobre as diferenças entre DENSE_RANK(), RANK() e ROW_NUMBER() está correta.
  • A ordenação final por departamento e salário decrescente é válida e não altera o conjunto retornado.
O que faltou2 pontos ▾
  • A resposta não informa que funções de janela não estão disponíveis em todos os SGBDs e versões.
  • A resposta não discute como valores NULL em salary devem ser tratados, embora a posição deles varie conforme o SGBD.
Só um revisor disse3 pontos ▾
  • DeepSeek V4.1 Flash: A consulta exige suporte a funções de janela; isso varia entre SGBDs e versões. vale conferir
  • DeepSeek V4.1 Flash: O comportamento de NULL na ordenação descendente varia entre SGBDs e pode afetar o ranking. vale conferir
  • Claude Haiku 4.5: O número de linhas retornadas pode ser maior que três quando há empates, pois o limite se aplica a valores salariais distintos, não a pessoas. ângulo útil

Resposta corrigida

WITH RankedSalaries AS (
    SELECT
        id,
        name,
        department_id,
        salary,
        DENSE_RANK() OVER (
            PARTITION BY department_id
            ORDER BY salary DESC
        ) AS salary_rank
    FROM employees
)
SELECT
    id,
    name,
    department_id,
    salary
FROM RankedSalaries
WHERE salary_rank <= 3
ORDER BY department_id, salary DESC;

A consulta está correta. DENSE_RANK() atribui a mesma classificação a pessoas com o mesmo salário e não pula classificações. Assim, salary_rank <= 3 retorna todas as pessoas que recebem um dos três maiores valores salariais distintos de seu departamento. O resultado pode conter mais de três pessoas quando houver empates.

RANK() poderia deixar de incluir o terceiro maior valor salarial distinto porque pula posições após empates, enquanto ROW_NUMBER() atribui números diferentes às linhas empatadas e poderia excluir algumas delas.

A consulta requer suporte a funções de janela, como em PostgreSQL, Oracle, SQL Server, SQLite 3.25+ e MySQL 8+. Ela não roda em MySQL 5.7 ou em versões antigas do MariaDB. Se salary puder ser NULL, também é preciso definir explicitamente como esses valores devem ser tratados, pois sua posição na ordenação varia conforme o SGBD.

NOSSA CONFERÊNCIA

Lemos este relatório antes de publicá-lo

Rodamos a consulta no SQLite com salários empatados (100, 100, 90, 80): ela devolve as quatro pessoas. RANK() teria deixado de fora quem ganha 80. Funções de janela exigem MySQL 8.0+, PostgreSQL, SQL Server, Oracle ou SQLite 3.25+.

Conferido com as fontes abaixo em 28 de outubro de 2026.

Fontes:

A revisão completa de cada modelo

DeepSeek V4.1 Flash▾

1. Minha resposta

A consulta está correta. "Um dos 3 maiores salários" deve ser lido como os 3 valores de salário mais altos de cada departamento, com todos os empatados incluídos — e DENSE_RANK() <= 3 é exatamente isso. RANK() perderia o terceiro valor quando há empate no topo, e ROW_NUMBER() quebraria os empates (ou seja, descartaria gente que ganha o mesmo salário).

2. Análise ponto a ponto

  • DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) — holds. Particiona por departamento e ranqueia em ordem decrescente sem pular números, que é a semântica pedida.
  • WHERE salary_rank <= 3 — holds. Retorna as linhas dos 3 maiores valores de salário, incluindo todas as empatadas em qualquer posição.
  • "Ao contrário do RANK(), o DENSE_RANK() não pula números em caso de empates" — holds. Com salários 100, 100, 90, 80: DENSE_RANK dá 1, 1, 2, 3; RANK dá 1, 1, 3, 4.
  • "Isso poderia fazer com que você perdesse o terceiro salário mais alto se houvesse muitos empates no topo" (sobre RANK()) — holds. No exemplo acima, RANK() <= 3 devolveria 100, 100 e 90, deixando 80 de fora — justamente o terceiro maior valor. A explicação está certa.
  • "ROW_NUMBER(): Atribui um número sequencial único a cada linha, mesmo em caso de empates. Isso significa que você teria um número diferente para cada funcionário, mesmo que tivessem o mesmo salário" — holds.
  • "Isso garante que estamos pegando os 3 maiores salários (ou mais, se houver empates)" — holds, com ressalva de redação. O número de valores de salário nunca passa de 3; o que cresce com empates é o número de linhas/pessoas. O texto deixa claro isso nos exemplos seguintes, então não há erro de resultado.
  • Exemplos de empate ("Se houver 3 funcionários com o mesmo salário mais alto, todos eles serão classificados como 1, e você os incluirá") — holds.
  • Cláusula ORDER BY department_id, salary DESC — holds (opcional, mas inofensiva; não altera o conjunto retornado).

Não encontrei nenhuma afirmação factualmente errada.

3. O que faltou

  • Compatibilidade: funções de janela exigem PostgreSQL, Oracle, SQL Server, SQLite 3.25+ ou MySQL 8+. Em MySQL 5.7 ou MariaDB antigo a consulta não roda — e o enunciado não fixa SGBD.
  • Alternativa sem CTE/janela (subconsulta correlacionada com COUNT(DISTINCT salary)), útil se o ambiente não suportar window functions. Não é obrigatória para responder, mas é a variação que se costuma esperar em contexto de entrevista.
  • NULL em salary: o posicionamento de NULLs em ORDER BY ... DESC varia (no Oracle vêm primeiro, no PostgreSQL/SQL Server por último), o que muda o ranking. Vale um comentário, ainda que seja caso de borda.

4. Resposta corrigida

A resposta está correta e não precisa ser reescrita — a consulta resolve o problema e a justificativa sobre DENSE_RANK() vs RANK() vs ROW_NUMBER() é precisa. Só acrescentaria as duas notas do item 3 (suporte a funções de janela e o caso de salary nulo); o código permanece como está.

Claude Haiku 4.5▾

Análise da Resposta

Minha própria resposta

A consulta está correta e bem explicada. Ela usa DENSE_RANK() com PARTITION BY department_id e filtra por salary_rank <= 3 em uma CTE, que é exatamente a abordagem recomendada para listar todas as pessoas nos 3 maiores salários de cada departamento, incluindo empates. A explicação didática sobre por que usar DENSE_RANK() em vez de RANK() ou ROW_NUMBER() está precisa.

Análise das afirmações principais

Estrutura da consulta com CTE — Holds. Usar uma CTE para calcular o ranking e depois filtrar é necessário porque funções de janela não podem ser usadas diretamente na cláusula WHERE.

Funcionamento do DENSE_RANK() — Holds. A descrição está correta: atribui a mesma classificação a salários iguais e não pula números. O exemplo dado ("se dois funcionários tiverem o maior salário, ambos receberão a classificação 1, e o próximo funcionário receberá a classificação 2") é preciso.

PARTITION BY department_id — Holds. Particiona corretamente o ranking por departamento, fazendo com que cada departamento tenha seu próprio ranking independente.

Comparação com RANK() e ROW_NUMBER() — Holds. As explicações estão alinhadas com as fontes consultadas:

  • RANK() pula números em caso de empate (1, 1, 3), o que pode fazer perder o terceiro salário único
  • ROW_NUMBER() atribui números sequenciais únicos, quebrando empates arbitrariamente
  • DENSE_RANK() é a escolha correta para incluir todos que compartilham um dos 3 maiores salários

Ordenação final — Holds. ORDER BY department_id, salary DESC agrupa por departamento e ordena salários de forma decrescente, como esperado.

O que poderia ter sido mencionado (mas não compromete a resposta)

A resposta não menciona explicitamente um detalhe importante: quantas linhas podem ser retornadas é variável. Se um departamento tem 5 pessoas com o mesmo salário em primeiro lugar, todas as 5 serão incluídas (porque ocupam um dos 3 maiores salários). Isso é correto segundo a exigência ("Se várias pessoas tiverem o mesmo salário, todas devem aparecer"), mas deixar claro que "top 3 salários" não significa "exatamente 3 pessoas" seria uma observação valiosa — como mencionam os datadank.com e aryasoft.com.

Além disso, a resposta não menciona que o PARTITION BY deve usar a coluna chave do departamento (não apenas comparar nomes), embora a consulta proposta já faça isso corretamente.

Corrected answer

A resposta holds — está correta e bem fundamentada. Não há erros técnicos na consulta ou na explicação.

Páginas que consultou: Top N per Group in SQL: Top 3 Salaries per Dept | DataDank · LeetCode SQL Problem & Solution: Department Top Three Salaries | LearnSQL.com · Top N per Group in SQL Server: 3 Methods Compared · 00185-department-top-three-salaries.sql · SQL Detective Mode: Using DENSE_RANK to Identify Top Earners by Department

SUA VEZ

Revise a resposta antes de confiar nela.

Cole uma resposta do ChatGPT, Claude, Gemini ou de qualquer IA. Duas IAs de outras empresas revisam e mostram o que está errado.

Revisar uma resposta Adicionar a extensão do Chrome

Ela coloca um botão Verificar embaixo de cada resposta do ChatGPT, Claude e Gemini.

Mais revisões de exemplo