Pular para o conteúdo principal

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

Banco de DadosOracle
Código
fc142289
Banca
FCC
Órgão
SEFAZ MT
Ano
2026
Cargo
FTE ( )
Um relatório de fiscalização foi elaborado para classificar contribuintes por valor total de crédito tributário, exigindo que empates recebam a mesma posição e que a numeração não apresente lacunas após empates. A função analítica Oracle que atende corretamente ao requisito é
  1. ALAG() com ordenação por valor do crédito para determinar posição relativa.
  2. BCOUNT() como função analítica para produzir a posição sem empates.
  3. CROW_NUMBER() com ordenação por valor do crédito em ordem decrescente.
  4. DRANK() com ordenação por valor do crédito em ordem decrescente.
  5. EDENSE_RANK() com ordenação por valor do crédito em ordem decrescente.
Revelar gabarito e comentário

GabaritoE — DENSE_RANK() com ordenação por valor do crédito em ordem decrescente.

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: ROW_NUMBER, RANK e DENSE_RANK

Gabarito: letra E. O requisito é duplo: empates recebem a mesma posição e a numeração não apresenta lacunas após empates. A única função analítica do Oracle que satisfaz exatamente essas duas condições é DENSE_RANK() com ORDER BY decrescente pelo valor do crédito — ela atribui a mesma posição a valores iguais e, ao contrário do RANK(), não pula posições depois de um empate. As demais alternativas ou não geram posição (LAG, COUNT), ou não respeitam o empate (ROW_NUMBER), ou geram lacunas (RANK).

As funções analíticas (também chamadas de window functions) operam sobre um conjunto de linhas definido pela cláusula OVER(), permitindo calcular valores que dependem de outras linhas do mesmo resultado — como posições, totais acumulados e médias móveis — sem agrupar o resultado final. No Oracle, as três funções de numeração mais cobradas são ROW_NUMBER(), RANK() e DENSE_RANK(), e a diferença entre elas só aparece quando há valores repetidos na coluna de ordenação.

Vamos entender cada uma com um exemplo concreto. Suponha uma tabela de contribuintes com os seguintes valores de crédito tributário: 95, 88, 88, 74, 74, 74 e 60. Aplicando as três funções com ORDER BY valor DESC, temos:

Valor

ROW_NUMBER

RANK

DENSE_RANK

95

1

1

1

88

2

2

2

88

3

2

2

74

4

4

3

74

5

4

3

74

6

4

3

60

7

7

4

Observe as diferenças:

  • ROW_NUMBER(): atribui um número sequencial único a cada linha, ignorando completamente os empates. Os dois contribuintes com 88 recebem posições 2 e 3, o que viola o requisito de "empates recebem a mesma posição".

  • RANK(): atribui a mesma posição aos empatados (88 → posição 2), mas pula posições: como dois contribuintes ocupam a posição 2, o próximo valor (74) começa na posição 4, deixando a posição 3 vazia. Isso viola o requisito de "numeração sem lacunas".

  • DENSE_RANK(): atribui a mesma posição aos empatados (88 → posição 2) e não pula posições: o próximo valor (74) recebe a posição 3, e assim por diante. É a única que atende aos dois requisitos simultaneamente.

A pegadinha da banca está em distinguir RANK() de DENSE_RANK(). Ambos tratam empates da mesma forma (mesma posição para valores iguais), mas o RANK() deixa lacunas na numeração, enquanto o DENSE_RANK() não. O enunciado é explícito ao exigir "que a numeração não apresente lacunas após empates" — essa é a palavra-chave que elimina a alternativa D e consagra a E.

Guarde a fronteira: RANK = posição com lacunas; DENSE_RANK = posição sem lacunas. É exatamente nesse critério que as alternativas se dividem.

1ROW_NUMBER
posição única
ignora empates
2RANK
empates na mesma posição
deixa lacunas
3DENSE_RANK
empates na mesma posição
sem lacunas
Funções de numeração (Oracle)
LEVELsoulevel.com.br
Funções de numeração (Oracle): ROW_NUMBER (posição única, ignora empates); RANK (empates na mesma posição, deixa lacunas); DENSE_RANK (empates na mesma posição, sem lacunas)

Alternativa A — ❌ Incorreta

LAG() é uma função analítica que acessa o valor de uma linha anterior no resultado, permitindo comparações entre linhas consecutivas (por exemplo, calcular a diferença entre o crédito de um contribuinte e o do anterior). Ela não gera nenhuma posição ou classificação — apenas retorna o valor de outra linha. Portanto, não atende ao requisito de classificar contribuintes por posição.

Alternativa B — ❌ Incorreta

COUNT() como função analítica conta o número de linhas dentro de uma partição ou janela, mas não produz uma posição sequencial. Ela retorna a quantidade de registros, não a classificação de cada um. Além disso, mesmo que fosse usada de forma criativa, não trataria empates com a mesma posição — o requisito central do enunciado.

Alternativa C — ❌ Incorreta

ROW_NUMBER() atribui um número sequencial único a cada linha, mesmo quando há valores iguais na ordenação. No exemplo, os dois contribuintes com crédito 88 receberiam posições 2 e 3, em vez da mesma posição. Isso viola diretamente o requisito de "empates recebem a mesma posição".

Alternativa D — ❌ Incorreta

RANK() atribui a mesma posição a valores empatados, mas deixa lacunas na numeração. No exemplo, após dois contribuintes na posição 2, o próximo valor recebe a posição 4, pulando a posição 3. Isso viola o requisito de "numeração não apresente lacunas após empates". É a alternativa que mais se aproxima da correta, mas falha justamente no segundo requisito.

Alternativa E — ✅ Correta ⟵ GABARITO

DENSE_RANK() atribui a mesma posição a valores empatados e não deixa lacunas na numeração. No exemplo, os contribuintes com crédito 88 recebem a posição 2, e o próximo valor (74) recebe a posição 3 — sem pular nenhuma posição. Isso atende exatamente aos dois requisitos do enunciado: empates com a mesma posição e numeração contínua.

A regra de ouro para a prova: quando o enunciado pedir "mesma posição para empates" e "sem lacunas", a resposta é DENSE_RANK(). Se pedir apenas "mesma posição para empates" (sem mencionar lacunas), pode ser RANK() ou DENSE_RANK(), mas a menção explícita a lacunas elimina o RANK().

Gabarito: letra E

Link permanente: /questoes/fc142289