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 é
ALAG() com ordenação por valor do crédito para determinar posição relativa.
BCOUNT() como função analítica para produzir a posição sem empates.
CROW_NUMBER() com ordenação por valor do crédito em ordem decrescente.
DRANK() com ordenação por valor do crédito em ordem decrescente.
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.
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().