Pular para o conteúdo principal

Questão de Banco de Dados — Bancos de Dados Espaciais — FGV 2024

Banco de DadosBancos de Dados Espaciais
Código
fg165274
Banca
FGV
Órgão
INPE
Ano
2024
Cargo
Tecno P1 ( )
Considere a seguinte estrutura de dados criada em SGBD PostgreSQL com extensão espacial PostGIS:   1 create index taxi_idx 2 select distinct taxi, 3            extract(day from t) as dia, 4            max(t) over p as chegada, 5            min(t) over p as partida 6 from taxi 7 particao p as (partition by taxi, extract(day from t)) 8 select taxi, 9            t, 10           lead(t) over (partition by taxi order by t) - t as time_gap, 11           st_distance(lead(geom) over (partition by taxi order by t), geom) as space_gap, 12           geom 13 from taxi   De acordo com o código supracitado, o atributo time_gap é do tipo
  1. Ainteger.
  2. Binterval.
  3. Ctimestamp.
  4. Dreal.
  5. Etime.
Revelar gabarito e comentário

GabaritoB — interval.

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 de janela no PostgreSQL: o tipo de time_gap

Gabarito: letra B. O atributo time_gap é do tipo interval, porque a expressão lead(t) over (...) - t subtrai dois valores timestamp, e no PostgreSQL a subtração entre dois timestamps produz um valor do tipo interval — que representa uma duração de tempo. É exatamente essa regra de tipagem da subtração que a questão cobra.

A questão mistura duas consultas SQL sobre uma tabela taxi com extensão espacial PostGIS. A primeira consulta usa uma janela nomeada p para calcular, por táxi e por dia, o horário máximo (max(t) over p) e mínimo (min(t) over p) — ou seja, a chegada e a partida de cada dia. A segunda consulta, que é a que interessa para a pergunta, usa a função de janela lead() para olhar a próxima linha dentro da partição de cada táxi, ordenada pelo tempo t.

A linha 10 é o coração da questão:

lead(t) over (partition by taxi order by t) - t as time_gap

A função lead(t) retorna o valor de t da próxima linha na janela (a próxima leitura de GPS daquele táxi, na ordem cronológica). Subtraindo o t da linha atual, obtemos o intervalo de tempo entre duas leituras consecutivas — o time_gap. A pergunta é: qual o tipo desse resultado?

No PostgreSQL, a subtração entre dois valores do tipo timestamp (ou timestamp with time zone) sempre retorna um valor do tipo interval. Isso é uma regra fundamental da aritmética de datas e horas: timestamp - timestamp = interval. O interval representa uma duração — anos, meses, dias, horas, minutos, segundos — e é exatamente o que faz sentido para um "gap" de tempo entre duas leituras.

Para fixar: a subtração de dois timestamp gera interval; a subtração de dois date também gera interval; a soma de um timestamp com um interval gera timestamp; e a subtração de um interval de um timestamp gera timestamp. A pegadinha da banca está em confundir o time_gap (que é uma duração) com um instante no tempo (timestamp ou time) ou com um número puro (integer ou real).

NÃO CAIA NESSA!

A banca explora a confusão entre "instante no tempo" e "duração de tempo". O time_gap é a diferença entre dois horários — uma duração —, não um horário em si. Por isso timestamp (letra C) e time (letra E) são distratores fortes: o candidato vê t (que é timestamp) e acha que o resultado também é timestamp. Mas a operação lead(t) - t transforma o tipo: o resultado de subtrair dois timestamps é sempre interval. Guarde a regra: timestamp - timestamp = interval.

  1. 1timestamp - timestamp
  2. 2= interval (duração)
  3. 3time_gap é interval
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

integer é um tipo numérico inteiro. A subtração de dois timestamp não produz um número inteiro — produz um interval. O integer seria o tipo de extract(day from t), que extrai o dia como um número, mas não o tipo de time_gap. A banca coloca integer como distrator para quem acha que a diferença de tempo é contada em unidades inteiras (dias, horas), sem perceber que o PostgreSQL devolve um tipo próprio para durações.

Alternativa B — ✅ Correta ⟵ GABARITO

A expressão lead(t) over (...) - t subtrai dois valores timestamp. No PostgreSQL, a subtração entre dois timestamp retorna um valor do tipo interval, que representa uma duração de tempo (ex.: 1 day 02:30:00). O time_gap é exatamente isso: o intervalo de tempo entre duas leituras consecutivas de um mesmo táxi. É o tipo correto e o único que faz sentido semanticamente para a coluna.

Alternativa C — ❌ Incorreta

timestamp representa um instante específico no tempo (data + hora). O time_gap não é um instante — é a diferença entre dois instantes. Subtrair dois timestamps nunca resulta em timestamp; resulta em interval. A letra C é o distrator mais perigoso, pois o candidato pode pensar que, como t é timestamp, o resultado da operação também seria. Mas a operação de subtração muda o tipo do resultado.

Alternativa D — ❌ Incorreta

real é um tipo numérico de ponto flutuante. Não há nenhuma operação na expressão que produza um número real. A subtração de timestamps gera interval, não um número. O real seria plausível se a expressão calculasse, por exemplo, uma distância numérica, mas para tempo o PostgreSQL usa o tipo interval.

Alternativa E — ❌ Incorreta

time representa apenas a hora do dia (sem data), como 14:30:00. O time_gap não é uma hora do dia — é uma duração. Além disso, a subtração de dois timestamp não produz time. A letra E confunde "hora" com "intervalo de tempo", que são conceitos distintos no PostgreSQL: time é um instante do dia, interval é uma quantidade de tempo.

Gabarito: letra B — o atributo time_gap é do tipo interval, pois resulta da subtração de dois valores timestamp no PostgreSQL.

Link permanente: /questoes/fg165274