P0 · Calentamiento

Publicado: semana 1 · Entrega: semana 3 · Individual

Antes de diseñar una base de datos conviene aprender a interrogar una que ya existe. En esta entrega van a conocer los datos de Chasqui, el contenedor del curso y la forma en que se revisan las entregas: diez consultas SQL y un script corto en Node.js. Cubre lo que vemos en las semanas 1 a 3: el modelo relacional, SELECT-FROM-WHERE, consultas sobre varias tablas, ORDER BY, DISTINCT, valores NULL y una primera agregación con GROUP BY.

Los datos

La base de datos de ejemplo tiene siete tablas. Para verlas, desde el contenedor (env/run.sh):

make            # crea la base de datos chasqui_test con los datos de ejemplo
make psql       # abre psql sobre ella

Dentro de psql, \dt lista las tablas y \d shipment muestra las columnas y restricciones de una tabla. Antes de escribir cualquier consulta, miren algunas filas de cada tabla (SELECT * FROM agency LIMIT 5;).

Tabla Una fila es…
agency una agencia de Chasqui: nombre, ciudad y región
customer un cliente, identificado por su DNI; el teléfono es opcional
vehicle un bus, camión (truck) o van, con su capacidad de carga en kg
route una ruta directa de una agencia a otra, con su distancia y tarifa base
trip un viaje de un vehículo por una ruta; arrival_at es NULL mientras está en camino
shipment un envío: remitente, destinatario, agencias, viaje asignado (o NULL), peso, valor declarado (opcional), precio y estado
shipment_event un evento en la historia de un envío: recibido, salió, llegó, entregado o devuelto

Las fechas son timestamptz y la base de datos usa la hora de Lima (America/Lima). “Febrero de 2026” quiere decir desde el 1 de febrero a las 00:00 hora de Lima hasta antes del 1 de marzo a las 00:00.

Qué hay que hacer

1. Diez consultas

Cada archivo queries/q01.sql … queries/q10.sql trae, en un comentario, lo que tiene que devolver la consulta. Escriban una sola sentencia SELECT debajo del comentario. Las columnas deben llamarse y estar en el orden que pide el enunciado (usen AS cuando haga falta) y las filas, en el orden indicado.

Prueben cada consulta en psql con \i queries/q01.sql antes de correr las pruebas. Cuando el resultado no coincida, comparen con el archivo expected/q01.tsv: tiene el encabezado y las filas que se esperan, con los valores tal como los muestra PostgreSQL (\N es NULL).

Pistas: no hace falta nada que no esté en las lecturas de las semanas 1 a 3. Para unir tablas basta con poner varias en el FROM y la condición en el WHERE; en la semana 4 veremos la sintaxis JOIN, que también se acepta. En q04 y q10, piensen en qué pasa con los envíos registrados el último día del mes a las 23:59.

2. Un script en Node.js: top-routes.mjs

Completen top-routes.mjs, que imprime las N rutas (pares origen-destino de los envíos) con más envíos:

node top-routes.mjs        # las 5 primeras
node top-routes.mjs 12     # las 12 primeras

Cada línea tiene el formato 1. Lima - La Victoria -> Lima - Ate: 158 (ver expected/top-routes-5.txt). A igual número de envíos se ordena por el nombre de la agencia de origen y luego por el de destino. Requisitos:

  • Usar un pg.Pool sin parámetros: dentro del contenedor, las variables de entorno PGHOST, PGUSER y PGDATABASE ya dicen a dónde conectarse (y make test cambia PGDATABASE por la base de datos de pruebas).
  • El límite va como parámetro de la consulta (LIMIT $1), no pegado al texto del SQL. En la semana 5 veremos por qué es una cuestión de seguridad.
  • Si N no es un entero positivo (0, -3, cinco, 2.5), imprimir un mensaje de uso en stderr y terminar con código de salida 1, sin conectarse a la base de datos.
  • Cerrar el pool al final (await pool.end()), también si la consulta falla: si no, el proceso no termina.

3. README

Un README.md corto en la carpeta: su nombre, qué consultas les costaron más y por qué, y una consulta que hayan escrito primero de forma incorrecta (qué devolvía y cómo se dieron cuenta).

Archivos

Archivo Qué es ¿Lo modifican?
queries/q01.sql … q10.sql Enunciado de cada consulta Sí: escriben la consulta debajo del comentario
top-routes.mjs Esqueleto del script Sí
Makefile make, make test, make psql, make clean No
p0.public.test.mjs Pruebas públicas No
expected/ Resultados esperados con los datos de ejemplo No

Pruebas

make test

Crea una base de datos nueva con los datos de ejemplo y corre las pruebas: una por consulta y tres para el script. La revisión corre además pruebas privadas con otros datos (generados con otra semilla), así que una consulta que devuelve valores escritos a mano, o que depende de un shipment_id concreto de los datos de ejemplo, falla en la revisión aunque pase aquí.