Soluções da Delegacia SQL

Inquérito 005, "Quem ligou primeiro": solução passo a passo

O boletim

O paiol da Cooperativa Agrícola, na Estrada do Café, pegou fogo na madrugada de sábado, 24 de maio. Queimaram cento e vinte sacas de milho, a estrutura de madeira e metade do telhado. Ninguém se machucou. O caseiro, que dorme no sítio vizinho, diz que acordou com o clarão.

O bombeiro é de Cambé e chegou às cinco e dez, quando já não tinha o que fazer.

Ocorrência 227, categoria outros, prejuízo de vinte e dois mil reais. Dona Terezinha, gerente da cooperativa, quer laudo rápido por causa do seguro, e o seguro só paga se não for descuido de funcionário.

A delegacia não tem perito e não vai ter. O que ela tem é o arquivo: o livro do 190, que anota a hora com minuto e o telefone de quem ligou, e o livro do balcão, que anota quem veio dar queixa. Cinco nomes deram depoimento no balcão. A chefia quer um nome antes que o seguro decida sozinho.

O que o caso ensina: ORDER BY e LIMIT.

Pergunta 1

Na madrugada de sábado, 24 de maio de 2003, o livro do 190 não parou. Traga todo chamado desse dia, na ordem em que o telefone tocou.

Ver as dicas do jogo
  1. Na madrugada de sábado, 24 de maio de 2003, o livro do 190 não parou. Traga da tabela `chamado` o `momento`, o `telefone`, o `lugar_informado`, o `resumo` e a `ocorrencia` de cada chamado desse dia, na ordem do `momento`.
  2. O dia inteiro é o `momento` que começa por '2003-05-24', com LIKE e o porcento no fim. A fila do relógio é ORDER BY na mesma coluna.
  3. Escreva: `SELECT momento, telefone, lugar_informado, resumo, ocorrencia FROM chamado WHERE momento LIKE '2003-05-24%' ORDER BY momento;`
Ver a consulta que resolve
SELECT momento, telefone, lugar_informado, resumo, ocorrencia FROM chamado WHERE momento LIKE '2003-05-24%' ORDER BY momento;

ORDER BY põe o resultado na ordem da coluna que você escolher. Sem ele o arquivo devolve na ordem em que guardou, e uma noite fora de ordem não conta a noite.

Resultado

momento telefone lugar_informado resumo ocorrencia
2003-05-24 00:12 3452-3390 Vila Aurora Som alto em festa na rua 7 0
2003-05-24 01:05 3452-1902 Centro Discussão de casal na praça 225
2003-05-24 02:14 3452-2040 Estrada do Café, km 11 Ônibus da Viação Falcão parado na pista com passageiros, sem sinalização 226
2003-05-24 03:51 3452-1187 Nova Aurora Cheiro de fumaça e clarão para os lados da cooperativa 0
2003-05-24 04:02 3452-2040 Estrada do Café Fogo no paiol da cooperativa 227
2003-05-24 04:06 3452-5133 Estrada do Café Fogo grande na cooperativa, pede bombeiro 0
2003-05-24 04:19 3452-4477 Estrada do Café Fogo no paiol, pede bombeiro de Cambé 0
2003-05-24 05:02 3452-6120 Nova Aurora Reclama de cheiro de queimado 0
2003-05-24 06:40 3452-2040 Estrada do Café Informa que o fogo foi controlado 0

Pergunta 2, a que o caso puxa no meio do caminho

O livro do 190 anotou três números de ocorrência nessa madrugada: 225, 226 e 227. Traga as três folhas do arquivo.

Ver as dicas do jogo
  1. Na madrugada de 24 de maio, o livro do 190 anotou três números de ocorrência: 225, 226 e 227. Traga da tabela `ocorrencia` o `id`, a `data`, a `hora`, a `categoria` e o `resumo` de cada um deles.
  2. Três números, uma lista: entre parênteses e separados por vírgula, depois de IN, para a coluna `id`.
  3. Escreva: `SELECT id, data, hora, categoria, resumo FROM ocorrencia WHERE id IN (225, 226, 227);`
Ver a consulta que resolve
SELECT id, data, hora, categoria, resumo FROM ocorrencia WHERE id IN (225, 226, 227);

A lista do IN pede o que você quer. O que o arquivo devolve é o que ele tem, e as duas coisas nem sempre são iguais.

Resultado

id data hora categoria resumo
225 2003-05-24 01:05 perturbacao Discussão de casal na praça
226 2003-05-24 02:14 outros Ônibus parado no km 11 com passageiros, sem sinalização
227 2003-05-24 04:20 outros Incêndio no paiol da Cooperativa; sem feridos

Pergunta 3

Os chamados dessa madrugada vieram de sete telefones. Traga do fichário quem tem algum deles.

Ver as dicas do jogo
  1. De quem são os telefones que ligaram para o 190 nesse dia? Traga da tabela `pessoa` o `id`, o `nome`, o `apelido`, a `ocupacao`, o `bairro_id` e o `telefone` de quem tem algum deles.
  2. Os sete números vão numa lista, depois de IN, cada um entre aspas simples, para a coluna `telefone`. Um deles aparece três vezes na grade do 190: na lista, basta uma.
  3. Escreva: `SELECT id, nome, apelido, ocupacao, bairro_id, telefone FROM pessoa WHERE telefone IN ('3452-3390', '3452-1902', '3452-2040', '3452-1187', '3452-5133', '3452-4477', '3452-6120');`
Ver a consulta que resolve
SELECT id, nome, apelido, ocupacao, bairro_id, telefone FROM pessoa WHERE telefone IN ('3452-3390', '3452-1902', '3452-2040', '3452-1187', '3452-5133', '3452-4477', '3452-6120');

IN troca uma fila de OR por uma lista: a linha volta se o valor estiver em qualquer lugar dela. E um valor pode estar em mais de uma linha da mesma gaveta, e o WHERE traz todas.

Resultado

id nome apelido ocupacao bairro_id telefone
4 Valdemar Prestes Cabeção investigador 3 3452-1902
32 Cleuza Mariano diarista 5 3452-1187
33 Wagner Mariano Waguinho ajudante de pedreiro 5 3452-1187
34 Elias Vasques Lió caseiro da Cooperativa 7 3452-5133

Pergunta 4

Traga os dez papéis mais novos do livro do balcão, do mais novo para o mais velho.

Ver as dicas do jogo
  1. O livro do balcão, a tabela `protocolo`, anota todo papel que entra na delegacia. Traga o `id`, a `data`, o `tipo`, o `assunto`, o `requerente` e a `ocorrencia` dos dez papéis de número mais alto, do mais novo para o mais velho.
  2. Número de protocolo é ordem de chegada: ordene pelo `id` com DESC, e corte com LIMIT 10, no fim.
  3. Escreva: `SELECT id, data, tipo, assunto, requerente, ocorrencia FROM protocolo ORDER BY id DESC LIMIT 10;`
Ver a consulta que resolve
SELECT id, data, tipo, assunto, requerente, ocorrencia FROM protocolo ORDER BY id DESC LIMIT 10;

DESC vira a ordem de trás para a frente. LIMIT corta o resultado no tamanho que você pedir, e é por vir depois do DESC que ele guarda os dez mais novos, e não os dez mais velhos.

Resultado

id data tipo assunto requerente ocorrencia
373 2003-05-24 ocorrencia Incêndio no paiol da Cooperativa 34 227
372 2003-05-24 ocorrencia Ônibus parado no km 11 com passageiros, sem sinalização 0 226
371 2003-05-21 pedido Pedido de segunda via de termo de entrega 128 0
370 2003-05-19 pedido Pedido de vista dos autos do inquérito 14 13 0
369 2003-05-19 pedido Pedido de cópia de boletim de ocorrência 98 0
368 2003-05-19 oficio Ofício da prefeitura sobre iluminação da praça 0 0
367 2003-05-14 oficio Ofício da companhia de energia sobre religação 0 0
366 2003-05-08 pedido Pedido de cópia de termo de declaração 147 0
365 2003-05-06 ocorrencia Estelionato — falso leiturista, terceiro caso, no Alto do Cruzeiro 31 224
364 2003-05-06 requisicao Requisição de antecedentes pelo fórum 0 0

Pergunta 5, a que o caso puxa no meio do caminho

Terça de manhã. Traga as cinco ocorrências mais novas do arquivo, da mais nova para a mais velha.

Ver as dicas do jogo
  1. Traga da tabela `ocorrencia` o `id`, a `data`, a `hora`, a `categoria` e o `resumo` das cinco ocorrências de número mais alto, da mais nova para a mais velha.
  2. É a receita do livro do balcão em outra gaveta: ordene pela coluna `id` com DESC e corte com LIMIT. Pela `data` não serve: duas ocorrências do mesmo dia empatam, e o empate sai em qualquer ordem.
  3. Escreva: `SELECT id, data, hora, categoria, resumo FROM ocorrencia ORDER BY id DESC LIMIT 5;`
Ver a consulta que resolve
SELECT id, data, hora, categoria, resumo FROM ocorrencia ORDER BY id DESC LIMIT 5;

É a mesma receita do livro do balcão: DESC vira a fila e LIMIT corta. Número de arquivo é ordem de chegada, e por isso quem ordena é o `id`: pela `data`, duas folhas do mesmo dia empatam, e o empate a máquina resolve como quiser.

Resultado

id data hora categoria resumo
227 2003-05-24 04:20 outros Incêndio no paiol da Cooperativa; sem feridos
225 2003-05-24 01:05 perturbacao Discussão de casal na praça
224 2003-05-06 10:40 estelionato Falso leiturista, terceiro caso; vítima informou o número do relógio
223 2003-05-02 19:03 acidente Queda de motociclista em piso molhado, anotado para averiguação
222 2003-04-26 15:39 furto Furto de botijão de gás da área de serviço, sem providência no momento

Pergunta 6

Traga as dez ocorrências mais novas da Nova Aurora, o bairro que o arquivo numera como 5, da mais nova para a mais velha.

Ver as dicas do jogo
  1. A tabela `ocorrencia` de novo, agora de um bairro só. Traga o `id`, a `data`, a `categoria` e o `resumo` das dez ocorrências de número mais alto da Nova Aurora, o `bairro_id` 5, da mais nova para a mais velha.
  2. É a receita do livro do balcão com uma condição antes: primeiro o WHERE do bairro, depois ORDER BY `id` com DESC, e o LIMIT 10 por último. O corte trabalha só com o que o bairro deixou passar.
  3. Escreva: `SELECT id, data, categoria, resumo FROM ocorrencia WHERE bairro_id = 5 ORDER BY id DESC LIMIT 10;`
Ver a consulta que resolve
SELECT id, data, categoria, resumo FROM ocorrencia WHERE bairro_id = 5 ORDER BY id DESC LIMIT 10;

O WHERE filtra primeiro, e o ORDER BY com LIMIT trabalha só com o que sobrou: as dez de número mais alto de um bairro, e não do arquivo inteiro. Número de arquivo é ordem de chegada, então o número mais alto é o papel mais novo.

Resultado

id data categoria resumo
216 2003-03-28 furto Furto de roupas do varal de uma residência, sem testemunhas
204 2003-02-01 furto Furto de mercadoria de dentro de veículo destrancado, comunicado por telefone ao 190
199 2003-01-16 outros Queimada sem autorização em terreno da Nova Aurora; Wagner Mariano orientado e liberado
198 2003-01-11 outros Achado de documento na via pública, com testemunha ouvida no local
194 2002-12-17 dano Pneu de veículo estacionado cortado, sem providência no momento
189 2002-11-25 perturbacao Bate-boca na saída do ginásio, comunicado por telefone ao 190
182 2002-10-19 desaparecimento Idoso se perdeu no caminho de volta da feira, anotado para averiguação
170 2002-08-27 perturbacao Bate-boca na saída do ginásio, sem testemunhas
168 2002-08-22 dano Muro dos fundos do mercadinho danificado a marretadas
100 2001-09-27 dano Portão de residência amassado por veículo em manobra, sem testemunhas

Quem foi

Ver o culpado e a prova

O culpado é Wagner Mariano.

As provas que fecham o caso:

  • A ocorrência 199, de 16 de janeiro: queimada sem autorização num terreno da Nova Aurora, com o Wagner Mariano orientado e liberado.

O Wagner veio com a mãe. Ela entrou na frente e falou primeiro, que é o que mães fazem, e o que ela falou foi que tinha ligado porque sentiu cheiro. Seu Jaime deixou ela terminar inteiro e depois leu, sem levantar a voz, duas folhas do livro do 190: a dela, das três e cinquenta e um, e a de outro telefone da Nova Aurora, que reclamou do cheiro de queimado às cinco e dois. No bairro dela, o cheiro chegou uma hora e onze minutos depois do telefonema.

Dona Cleuza sentou. O Wagner ficou em pé e contou tudo em três frases, do jeito de quem repetiu na cabeça a noite inteira: o mato estava alto, ele queria passar de moto, o vento virou.

Ficou no artigo de incêndio culposo e vai responder solto. O seguro da cooperativa, esse, não paga, e não foi por culpa do caseiro.

Antes de desligar, Seu Jaime pediu de novo a folha 226, a do ônibus parado no km 11, que você tinha lido para ele na segunda. O arquivo devolveu nada. Ele disse que devia ser erro de digitação e ficou olhando o nada por um tempo que não cabe num boletim. Dona Sirlei ainda estava no balcão quando você saiu.