Questão de Banco de Dados — Geral — CESPE / CEBRASPE 2026
- Código
- ce391458
- Banca
- CESPE / CEBRASPE
- Órgão
- TCE RN
- Ano
- 2026
- Cargo
- AudCE ( )

- CCerto
- EErrado

GabaritoC — Certo
Gabarito: Certo. A afirmação está correta porque a função de janela ROW_NUMBER() é, de fato, utilizada para segmentar os registros por contrato (partição por id_contrato) e ordená-los cronologicamente de forma decrescente (por data_atualizacao), permitindo identificar a versão mais recente de cada contrato em uma tabela de CDC. A ressalva sobre a necessidade de granularidade suficiente na coluna data_atualizacao para garantir uma ordenação unívoca também é tecnicamente precisa, pois, sem ela, registros distintos de um mesmo contrato poderiam apresentar o mesmo marcador temporal, comprometendo a identificação da versão mais recente.
A função ROW_NUMBER() é uma função de janela (window function) do SQL que atribui um número sequencial a cada linha dentro de uma partição, começando em 1. A sintaxe básica é ROW_NUMBER() OVER (PARTITION BY coluna_particao ORDER BY coluna_ordenacao). No contexto da questão, a partição é feita por id_contrato, o que significa que a numeração é reiniciada para cada contrato. A ordenação é feita por data_atualizacao DESC, o que faz com que a linha mais recente de cada contrato receba o número 1. Assim, ao filtrar as linhas com ROW_NUMBER() = 1, obtém-se a versão mais recente de cada contrato.
A técnica é amplamente utilizada em arquiteturas de dados para auditoria e análise de dados históricos, especialmente em tabelas de CDC (Change Data Capture), onde cada alteração em um registro gera uma nova linha com um timestamp. A principal vantagem é que ela permite reconstruir o estado atual de cada entidade sem a necessidade de tabelas auxiliares ou consultas complexas com GROUP BY e MAX.
A ressalva sobre a granularidade da coluna data_atualizacao é crucial. Se dois registros de um mesmo contrato tiverem exatamente o mesmo timestamp, a ordenação por data_atualizacao não será unívoca, e o ROW_NUMBER() atribuirá números de forma arbitrária entre esses registros empatados. Isso pode fazer com que a versão selecionada como "mais recente" não seja a correta. Para evitar esse problema, é comum adicionar uma coluna de sequência (como um ID incremental) ou usar uma coluna de timestamp com maior precisão (como nanossegundos) na cláusula ORDER BY.
A pegadinha que a banca explora aqui é a tentação de achar que a ressalva sobre a granularidade torna a afirmação incorreta. Na verdade, a ressalva é uma condição necessária para que a abordagem seja eficaz, e a afirmação a reconhece explicitamente, tornando-a correta. O candidato que não conhece o funcionamento das funções de janela pode achar que a ressalva é uma falha, mas ela é, na verdade, um requisito técnico válido.
Guarde a distinção entre ROW_NUMBER(), RANK() e DENSE_RANK(): enquanto ROW_NUMBER() atribui números sequenciais únicos, RANK() e DENSE_RANK() lidam com empates de forma diferente. Essa distinção é frequentemente cobrada em provas e é essencial para resolver questões sobre funções de janela.
A afirmação está correta. A função ROW_NUMBER() é usada para segmentar os registros por contrato (via PARTITION BY id_contrato) e ordená-los cronologicamente de forma decrescente (via ORDER BY data_atualizacao DESC). Isso permite identificar a versão mais recente de cada contrato, pois a linha com número 1 em cada partição é a mais recente. A condição sobre a granularidade da coluna data_atualizacao é tecnicamente válida, pois, sem ela, empates no timestamp poderiam gerar uma ordenação não unívoca, comprometendo a identificação correta da versão mais recente.
Gabarito: Certo
Link permanente: /questoes/ce391458