Questão nº 59

Questão de Análise de Dados · FGV TCU 2021 (nº 59)

FGV2021Auditor Federal de Controle Externo - Área Controle Externo (AUFC-CE)Análise de Dados
Gabarito: Bver comentário ↓

ATENÇÃO!

Nas próximas três questões, considere as tabelas de banco de dados T, TX e DUAL, exibidas com suas respectivas instâncias a seguir.

Figura da questão de Análise de Dados


Supondo que a coluna sequencia da tabela T, anteriormente definida, deveria conter números inteiros em sequência contínua, seria preciso descobrir os intervalos de valores faltantes. Um valor é considerado faltante quando a) é um número inteiro n entre o menor e o maior valor da tabela, tal que n não esteja presente na tabela, ou b) é um número presente na tabela T, com valor nulo na coluna caracteristica.

[IMG-PENDENTE]{Q59}

O comando SQL que produz o resultado acima, a partir da instância inicialmente definida para a tabela T, é:

Resposta comentada

Gabarito Alternativa B

Para encontrar intervalos de valores faltantes em uma sequência, precisamos identificar os números que não estão presentes ou que estão presentes, mas com uma característica nula. Um número é considerado não faltante (ou "válido") se ele existe na tabela T e sua coluna caracteristica não é nula. Os comandos SQL geralmente encontram esses intervalos identificando pares de números "válidos" consecutivos e calculando a lacuna entre eles.

  • Tabela T:
    sequencia | caracteristica
    ----------|---------------
    1         | 'a'
    2         | 'b'
    4         | 'c'
    5         | NULL
    7         | 'd'
    8         | 'e'
    10        | 'f'
    
  • Números "não faltantes" (válidos): Aqueles com caracteristica IS NOT NULL.
    São eles: 1, 2, 4, 7, 8, 10.
  • Gaps (intervalos de faltantes) entre os "não faltantes":
    • Entre 2 e 4: O número 3 está faltando.
    • Entre 4 e 7: Os números 5 e 6 estão faltando. (5 está em T mas com caracteristica nula, e 6 não está em T).
    • Entre 8 e 10: O número 9 está faltando.

O resultado esperado, portanto, seria:

inicio | fim | faltantes
-------|-----|----------
3      | 3   | 1
5      | 6   | 2
9      | 9   | 1

Análise das alternativas:

  • (A) Incorreta: A cláusula SELECT está errada, pois inicio e fim devem ser t1.sequencia + 1 e t2.sequencia - 1, respectivamente, para representar o intervalo entre t1 e t2. Além disso, não exige que t1.caracteristica e t2.caracteristica sejam NOT NULL, e a subconsulta NOT EXISTS não filtra por t3.caracteristica IS NOT NULL, o que faria com que números como 5 (com caracteristica nula) fossem considerados "presentes" e quebrassem o intervalo de faltantes.
  • (B) Correta: Esta alternativa implementa a lógica correta.
    • select t1.sequencia +1 'inicio', t2.sequencia -1 'fim', t2.sequencia - t1.sequencia -1 faltantes: Calcula corretamente o início, fim e a contagem dos números faltantes no intervalo.
    • t1.sequencia < t2.sequencia e t1.sequencia <> t2.sequencia -1: Garantem que t1 vem antes de t2 e que há pelo menos um número entre eles.
    • t1.caracteristica is not null and t2.caracteristica is not null: Crucial, pois define que t1 e t2 devem ser números "não faltantes" (válidos) para servirem como limites do intervalo.
    • and (not exists (select * from T t3 where t3.sequencia > t1.sequencia and t3.sequencia < t2.sequencia and t3.caracteristica is not null)): Esta é a "pegadinha" e o ponto chave. Esta subconsulta NOT EXISTS verifica se não existe nenhum outro número "não faltante" (válido) entre t1.sequencia e t2.sequencia. Se não houver, significa que t1 e t2 são os números "não faltantes" consecutivos, e todo o intervalo entre eles é de números faltantes. Por exemplo, para (t1=4, t2=7), o número 5 existe em T mas tem caracteristica IS NULL, então ele não satisfaz t3.caracteristica IS NOT NULL. O número 6 não existe em T. Assim, a subconsulta retorna vazio, NOT EXISTS é verdadeiro, e o intervalo 5-6 é identificado.
  • (C) Incorreta: Falta a condição t1.sequencia < t2.sequencia no WHERE principal, o que levaria a resultados incorretos. A condição OR exists (select ... and t3.caracteristica is null) na cláusula WHERE é problemática, pois combinaria múltiplos intervalos de faltantes em um só se houvesse qualquer t3 com caracteristica IS NULL no meio, mesmo que houvesse números "não faltantes" entre t1 e t2.
  • (D) Incorreta: A condição exists (select * from T t3 where t3.sequencia > t1.sequencia and t3.sequencia < t2.sequencia) é o oposto do que se busca. Ela exigiria que existisse algum número em T entre t1 e t2 (independentemente da característica), o que filtraria os verdadeiros intervalos de faltantes.
  • (E) Incorreta: A subconsulta NOT EXISTS (select * from T t3 where t3.sequencia > t1.sequencia and t3.sequencia < t2.sequencia) não inclui a condição and t3.caracteristica is not null. Isso significa que ela consideraria qualquer número presente em T (mesmo com caracteristica nula, como o 5) como um número que "quebra" o intervalo de faltantes. Assim, para o par (t1=4, t2=7), a subconsulta encontraria t3=5, e a condição NOT EXISTS seria falsa, impedindo a identificação do intervalo 5-6.

Fonte: FGV TCU 2021 Auditor Federal de Controle Externo - Área Controle Externo (AUFC-CE) (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho