Pular para o conteúdo principal

Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2025

Banco de DadosSQL
Código
ce195365
Banca
CESPE / CEBRASPE
Órgão
BANRISUL
Ano
2025
Nível
Superior
Cargo
Técnico em Tecnologia da Informação II - Área: Administração de Banco de Dados
Considerando que, em um sistema de vendas, haja a tabela de nome vendas_completo(vendedor, regiao, valor), em que cada linha registre uma venda feita por determinado vendedor em sua região, assinale a opção em que é corretamente apresentada a consulta SQL que, sem usar JOIN, apresenta como resultado exatamente as seguintes quatro colunas: vendedor; regiao; total_vendas, correspondente à soma de valor por vendedor; e ranking_regiao, de modo que empates estejam na mesma posição e “pulem” postos.
  1. ASELECT DISTINCTvendedor,regiao,SUM(valor) OVER (PARTITION BY vendedor,regiao) AS total_vendas,RANK() OVER (PARTITION BY regiaoORDER BY SUM(valor) OVER (PARTITION BYvendedor, regiao) DESC) AS ranking_regiaoFROM vendas_completo;
  2. BSELECTvendedor,regiao, SUM(valor) AS total_vendas,RANK() OVER (PARTITION BY regiaoORDER BY SUM(valor) DESC) AS ranking_regiaoFROM vendas_completoGROUP BY vendedor, regiao;
  3. CSELECTvendedor,regiao,SUM(valor) OVER (PARTITION BY vendedor) AS total_vendas,DENSE_RANK() OVER (PARTITION BY regiaoORDER BY SUM(valor) OVER (PARTITION BYvendedor) DESC) AS ranking_regiaoFROM vendas_completoGROUP BY vendedor, regiao;
  4. DSELECT DISTINCTvendedor,regiao,SUM(valor) OVER (PARTITION BY vendedor) AStotal_vendas,ROW_NUMBER() OVER (PARTITION BY regiaoORDER BY SUM(valor) OVER (PARTITION BYvendedor) DESC) AS ranking_regiaoFROM vendas_completo;
  5. ESELECTvendedor,regiao,SUM(valor) OVER (PARTITION BY vendedor, regiao) AS total_vendas,ROW_NUMBER() OVER (PARTITION BY regiaoORDER BY SUM(valor) OVER (PARTITION BYvendedor, regiao) DESC) AS ranking_regiaoFROM vendas_completo;
Revelar gabarito e comentário

GabaritoB — SELECT vendedor, regiao, SUM(valor) AS total_vendas, RANK() OVER ( PARTITION BY regiao ORDER BY SUM(valor) DESC ) AS ranking_regiao FROM vendas_completo GROUP BY vendedor, regiao;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Funções de Janela e Agregação em SQL: RANK() vs DENSE_RANK() vs ROW_NUMBER()

Gabarito: alternativa B. A consulta correta agrupa as vendas por vendedor e região (GROUP BY vendedor, regiao), calcula o total por grupo com SUM(valor) e, em seguida, usa RANK() OVER (PARTITION BY regiao ORDER BY SUM(valor) DESC) para ranquear os vendedores dentro de cada região, pulando postos em caso de empate — exatamente como o enunciado pede.

A questão testa o conhecimento sobre funções de janela (RANK, DENSE_RANK, ROW_NUMBER) e a combinação delas com agregação GROUP BY. O comando "sem usar JOIN" é atendido por todas as alternativas (nenhuma usa JOIN explícito). O diferencial está no comportamento dos rankings e na sintaxe correta.

1RANK()
Pula postos em empate
Ex.: 1,2,2,4
2DENSE_RANK()
Não pula postos
Ex.: 1,2,2,3
3ROW_NUMBER()
Números únicos sequenciais
Ignora empates
Funções de janela (ranking)
LEVELsoulevel.com.br
Funções de janela (ranking): RANK() (Pula postos em empate, Ex.: 1,2,2,4); DENSE_RANK() (Não pula postos, Ex.: 1,2,2,3); ROW_NUMBER() (Números únicos sequenciais, Ignora empates)

Alternativa A — ❌ Incorreta

Usa SELECT DISTINCT com funções de janela aninhadas: SUM(valor) OVER (PARTITION BY vendedor, regiao) dentro do ORDER BY de RANK(). Isso é inválido em SQL padrão — funções de janela não podem ser aninhadas. Além disso, o DISTINCT apenas remove duplicatas, mas sem agregação não produz o total por vendedor/região.

Alternativa B — ✅ Correta ⟵ GABARITO

A sintaxe é válida: GROUP BY vendedor, regiao agrupa as linhas; SUM(valor) retorna a soma do grupo; RANK() OVER (PARTITION BY regiao ORDER BY SUM(valor) DESC) atribui um ranking por região, pulando postos quando há empate. Atende todos os requisitos.

Alternativa C — ❌ Incorreta

  • SUM(valor) OVER (PARTITION BY vendedor) calcula o total do vendedor (independente da região), não o total por vendedor e região como esperado.

  • Usa DENSE_RANK(), que não pula postos em caso de empate (sequência 1,2,2,3...), contrariando o requisito "pulem postos".

  • Também há aninhamento de funções de janela no ORDER BY.

Alternativa D — ❌ Incorreta

  • SUM(valor) OVER (PARTITION BY vendedor) novamente calcula o total do vendedor, não por vendedor e região.

  • Usa ROW_NUMBER(), que atribui números únicos sequenciais, sem considerar empates (não pula postos, mas também não os trata).

Alternativa E — ❌ Incorreta

  • SUM(valor) OVER (PARTITION BY vendedor, regiao) é uma função de janela sobre cada linha, repetindo o mesmo total para linhas iguais, sem agregação.

  • ROW_NUMBER() não trata empates.

  • Aninhamento de funções de janela no ORDER BY é inválido.

NÃO CAIA NESSA!

A banca explora a confusão entre RANK (pula postos) e DENSE_RANK (não pula), além de tentar enganar com aninhamento de funções de janela, que é sintaxe inválida. Memorize: RANK → empates ocupam mesma posição e postos seguintes são pulados; DENSE_RANK → empates mesma posição, mas postos seguintes não são pulados; ROW_NUMBER → números sequenciais únicos.

Gabarito: alternativa B.

Link permanente: /questoes/ce195365