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.Poolsin parámetros: dentro del contenedor, las variables de entornoPGHOST,PGUSERyPGDATABASEya dicen a dónde conectarse (ymake testcambiaPGDATABASEpor 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 enstderry 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í.