Pular para o conteúdo principal

Questão de Banco de Dados — Oracle — FCC 2025

Banco de DadosOracle
Código
fc150354
Banca
FCC
Órgão
MPE PI
Ano
2025
Cargo
Ana Min ( )
No Oracle Database 21c, a função analítica RANK é utilizada para atribuir classificações numéricas às linhas de uma consulta SQL, com base em uma ordenação definida pelo usuário. Quando aplicada a uma janela analítica, a função
  1. Aignora valores NULL por padrão, excluindo-os completamente do cálculo do ranking.
  2. Batribui a mesma classificação a linhas com valores iguais, criando lacunas no ranking para as próximas posições.
  3. Catribui números sequenciais únicos a cada linha, independentemente de empates, como a função ROW_NUMBER.
  4. Dagrega linhas em um único valor, reduzindo o número de linhas retornadas na consulta.
  5. Esó pode ser usada sem a cláusula PARTITION BY, ordenando todas as linhas da consulta.
Revelar gabarito e comentário

GabaritoB — atribui a mesma classificação a linhas com valores iguais, criando lacunas no ranking para as próximas posições.

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 analíticas no Oracle: RANK, DENSE_RANK e ROW_NUMBER

Gabarito: letra B. A função RANK atribui a mesma classificação a linhas com valores iguais (empates) e, em seguida, cria lacunas no ranking para as próximas posições — por exemplo, se duas linhas empatam na posição 1, a próxima recebe a posição 3, não a 2. Esse comportamento é o que distingue o RANK do DENSE_RANK (que não deixa lacunas) e do ROW_NUMBER (que numera sequencialmente sem considerar empates).

As funções analíticas (também chamadas de funções de janela) são um recurso poderoso do SQL para realizar cálculos sobre um conjunto de linhas relacionadas à linha atual, sem agrupar o resultado em uma única linha. Elas operam sobre uma "janela" definida pela cláusula OVER, que pode conter PARTITION BY (para dividir o resultado em partições) e ORDER BY (para definir a ordem dentro de cada partição). A sintaxe básica é: função_analítica(coluna) OVER (PARTITION BY ... ORDER BY ...).

O RANK é uma das funções de numeração, junto com DENSE_RANK e ROW_NUMBER. A diferença crucial está no tratamento de empates:

Função

Comportamento com empates

Exemplo (valores 95, 88, 88, 74)

RANK

Mesma posição para empatados, com lacunas

1, 2, 2, 4

DENSE_RANK

Mesma posição para empatados, sem lacunas

1, 2, 2, 3

ROW_NUMBER

Numeração sequencial única, ignora empates

1, 2, 3, 4

No Oracle, por padrão, as funções analíticas incluem valores NULL no cálculo, tratando-os como os maiores valores (quando a ordenação é crescente) ou como os menores (quando é decrescente). Isso é diferente de funções de agregação como SUM ou AVG, que ignoram NULL por padrão. Para alterar esse comportamento, pode-se usar a cláusula NULLS FIRST ou NULLS LAST na ordenação.

A cláusula PARTITION BY é opcional. Sem ela, a função analítica considera todas as linhas da consulta como uma única partição. Com ela, o ranking é reiniciado para cada partição. Portanto, a afirmação de que o RANK "só pode ser usado sem PARTITION BY" é incorreta.

A pegadinha desta questão está em confundir RANK com ROW_NUMBER ou com funções de agregação. A banca explora exatamente a característica das lacunas, que é o que diferencia o RANK dos demais. Guarde bem essa distinção: RANK = empate + lacuna; DENSE_RANK = empate sem lacuna; ROW_NUMBER = sem empate.

1RANK
Empates: mesma posição
Lacunas no ranking
2DENSE_RANK
Empates: mesma posição
Sem lacunas
3ROW_NUMBER
Sem empates
Numeração sequencial única
Funções de numeração
LEVELsoulevel.com.br
Funções de numeração: RANK (Empates: mesma posição, Lacunas no ranking); DENSE_RANK (Empates: mesma posição, Sem lacunas); ROW_NUMBER (Sem empates, Numeração sequencial única)

Alternativa A — ❌ Incorreta

Afirma que o RANK ignora valores NULL por padrão. Isso é falso: as funções analíticas incluem valores NULL no cálculo, tratando-os conforme a ordenação (por padrão, NULL é considerado o maior valor em ordenação crescente). Para excluí-los, seria necessário usar NULLS LAST ou filtrar com WHERE coluna IS NOT NULL. Essa confusão vem do comportamento das funções de agregação tradicionais, que ignoram NULL.

Alternativa B — ✅ Correta ⟵ GABARITO

Descreve exatamente o comportamento do RANK: linhas com valores iguais recebem a mesma classificação e, em seguida, há lacunas no ranking. Por exemplo, com valores 95, 88, 88, 74, o RANK retorna 1, 2, 2, 4 — a posição 3 é pulada. Essa é a característica que o distingue do DENSE_RANK, que retornaria 1, 2, 2, 3.

Alternativa C — ❌ Incorreta

Descreve o comportamento do ROW_NUMBER, não do RANK. O ROW_NUMBER atribui números sequenciais únicos a cada linha, independentemente de empates, enquanto o RANK atribui a mesma posição a valores iguais. A banca troca as funções para confundir o candidato.

Alternativa D — ❌ Incorreta

Confunde função analítica com função de agregação. Funções de agregação como SUM, COUNT e AVG reduzem o número de linhas retornadas, agrupando-as em um único valor. Já as funções analíticas preservam o número de linhas, adicionando uma coluna com o resultado do cálculo para cada linha. O RANK não agrega nem reduz linhas.

Alternativa E — ❌ Incorreta

Afirma que o RANK só pode ser usado sem PARTITION BY. Isso é falso: a cláusula PARTITION BY é opcional e, quando usada, divide o resultado em partições, reiniciando o ranking em cada uma. Sem ela, o ranking é calculado sobre todas as linhas da consulta. A banca tenta fazer o candidato acreditar que o PARTITION BY é obrigatório ou proibido, quando na verdade é um recurso opcional e poderoso.

NÃO CAIA NESSA!

A banca adora trocar as funções de numeração entre si. Lembre-se: RANK deixa lacunas, DENSE_RANK não deixa, e ROW_NUMBER ignora empates. Se a alternativa falar em "números sequenciais únicos", é ROW_NUMBER; se falar em "mesma classificação sem lacunas", é DENSE_RANK; se falar em "lacunas", é RANK. Com esse critério, você elimina as pegadinhas na hora.

Gabarito: letra B

Link permanente: /questoes/fc150354