lección 1
DuckDB avanzado: el motor que aplasta a los demás en analítica
Exprime el potencial de DuckDB: lectura de Parquet y JSON, acceso HTTP remoto, generate_series avanzado y verificación del dataset de práctica.
⏱ 50 min
Ya conoces DuckDB de la Skill 7. Lo instalaste, ejecutaste queries, creaste tablas con generate_series y entendiste la diferencia con PostgreSQL. Ahora vamos a exprimir su potencial real. Porque DuckDB no es solo "un SQLite para analítica" — es un motor que en benchmarks destruye a PostgreSQL en queries analíticas por un factor de 10x-100x. Y en esta skill vas a necesitar todo ese poder: window functions, CTEs recursivas, planes de ejecución y queries sobre millones de filas.
En esta lección vas a entender POR QUÉ DuckDB es tan rápido, qué formatos puede leer nativamente (spoiler: Parquet, JSON, CSV y archivos remotos por HTTP) y vas a verificar que el dataset de práctica del e-commerce está listo para las 7 lecciones que siguen.
### ¿Por qué DuckDB es BRUTAL para analítica?
Hay tres razones técnicas por las que DuckDB aplasta a PostgreSQL en queries analíticas. No es magia — es ingeniería pensada para un problema diferente:
- 01.Almacenamiento columnar: PostgreSQL guarda filas completas juntas. Si tu query solo necesita 2 de 50 columnas, lee las 50 de todas formas. DuckDB guarda cada columna por separado — solo lee lo que necesita. En una tabla con 50 columnas y 10 millones de filas, eso puede ser 25x menos datos leídos.
- 02.Ejecución vectorizada: PostgreSQL procesa fila por fila (tuple-at-a-time). DuckDB procesa bloques de miles de valores a la vez (vectores de 1024+ elementos), aprovechando las instrucciones SIMD del procesador. Es la diferencia entre llevar las compras una bolsa a la vez vs llenar el maletero de un tirón.
- 03.Sin overhead de servidor: PostgreSQL gestiona conexiones, permisos, WAL, vacuuming, locks... DuckDB no tiene nada de eso. Toda la potencia del CPU se dedica a TU query. Es un F1 sin airbags — peligroso en producción, perfecto en tu laboratorio.
Estos números son reales. En el benchmark TPC-H (el estándar de la industria para queries analíticas), DuckDB supera a PostgreSQL en cada una de las 22 queries del benchmark. No es que PostgreSQL sea malo — es que está optimizado para OTRO tipo de carga (transaccional, multi-usuario).
### Features avanzadas: leer cualquier formato sin importar
DuckDB puede leer datos de múltiples formatos sin necesidad de cargarlos primero en una tabla. Esto es enormemente práctico: llegas a un directorio con archivos Parquet, CSVs y JSONs y puedes hacer queries directamente sobre ellos:
1-- Leer un CSV directamente (sin CREATE TABLE)2SELECT * FROM read_csv_auto('ventas_2024.csv') LIMIT 5;34-- Leer Parquet (formato columnar comprimido)5SELECT region, SUM(importe) AS total6FROM read_parquet('data/ventas/*.parquet')7GROUP BY region;89-- Leer JSON10SELECT * FROM read_json_auto('eventos.json') LIMIT 10;1112-- ¿Leer archivos REMOTOS por HTTP!13SELECT COUNT(*) FROM read_csv_auto(14 'https://raw.githubusercontent.com/..../data.csv'15);
DuckDB lee CSV, Parquet, JSON y archivos remotos — sin importar nada
Esto hace a DuckDB perfecto para explorar data lakes. En la Skill 12 (Data Lakes y formatos modernos), vas a usar DuckDB para consultar archivos Parquet directamente desde S3 sin necesidad de cargarlos en ninguna base de datos. Pero por ahora, lo importante es que sepas que esta capacidad existe.
### El dataset de práctica: tu e-commerce en esta skill
Para las siguientes 7 lecciones trabajarás con el mismo dataset de e-commerce que ya usaste en SQL básico. Las tablas ya están cargadas en la plataforma. Vamos a hacer un repaso rápido de lo que tienes disponible:
1-- Ver todas las tablas disponibles2SHOW TABLES;34-- Conteo rápido de cada tabla5SELECT 'clientes' AS tabla, COUNT(*) AS filas FROM clientes6UNION ALL SELECT 'pedidos', COUNT(*) FROM pedidos7UNION ALL SELECT 'productos', COUNT(*) FROM productos8UNION ALL SELECT 'categorias', COUNT(*) FROM categorias9UNION ALL SELECT 'lineas_pedido', COUNT(*) FROM lineas_pedido10UNION ALL SELECT 'vendedores', COUNT(*) FROM vendedores11UNION ALL SELECT 'ventas_diarias', COUNT(*) FROM ventas_diarias12UNION ALL SELECT 'ventas_mensuales', COUNT(*) FROM ventas_mensuales13UNION ALL SELECT 'empleados', COUNT(*) FROM empleados;
Inventario del dataset: lo que tienes para practicar
- clientes (5.000 filas): id, nombre, email, ciudad, fecha_registro, canal_adquisicion, es_vip
- pedidos (20.000 filas): id, cliente_id, producto_id, cantidad, fecha, importe, estado
- productos (200 filas): id, nombre, categoria_id, precio, stock
- categorias (5 filas): id, nombre, descripcion — tabla de referencia para productos
- lineas_pedido (30.000 filas): id, pedido_id, producto_id, cantidad, precio_unitario — detalle de cada pedido
- vendedores (10 filas): id, nombre, equipo, categoria, ventas — para ejercicios de rankings
- ventas_diarias (365 filas): fecha, importe_diario — para acumulados y medias móviles
- ventas_mensuales (24 filas): fecha, importe — para LAG/LEAD y comparaciones temporales
- empleados (100 filas): id, nombre, departamento, salario, fecha_contratacion
### Verificación: tu primer query analítico cruzado
Vamos a hacer una query que cruza clientes con pedidos para verificar que todo funciona. Esta query usa GROUP BY, JOIN, filtros y agregaciones — todo lo que ya sabes de la Skill 7:
1-- Resumen por ciudad: clientes, pedidos completados y gasto2SELECT3 c.ciudad,4 COUNT(DISTINCT c.id) AS clientes_unicos,5 COUNT(p.id) AS total_pedidos,6 SUM(p.importe)::INTEGER AS gasto_total,7 ROUND(AVG(p.importe), 2) AS ticket_medio8FROM clientes c9JOIN pedidos p ON p.cliente_id = c.id10WHERE p.estado = 'completado'11GROUP BY c.ciudad12ORDER BY gasto_total DESC;
Si ves 5 ciudades con métricas, tu dataset está perfecto para esta skill.
Si alguna query de verificación no funciona, refresca la página. Las tablas se cargan automáticamente la primera vez que abres un ejercicio de esta skill.
### Lo que vas a dominar en esta skill
Las window functions son lo que separa al junior del senior en cualquier entrevista técnica de datos. Son la respuesta a "quiero el detalle Y el resumen al mismo tiempo". En las próximas lecciones vas a:
- 01.Entender el problema que resuelven las window functions (lección 2)
- 02.Dominar ROW_NUMBER, RANK y DENSE_RANK (lección 3)
- 03.Comparar con LAG y LEAD (lección 4)
- 04.Calcular sumas progresivas y medias móviles (lección 5)
- 05.Leer planes de ejecución con EXPLAIN (lección 6)
- 06.Entender índices y optimización (lección 7)
- 07.Proyecto final: análisis de retención de clientes con cohortes (lección 8)
Consejo de senior: si alguna vez te preguntan en una entrevista "¿sabes window functions?", la respuesta correcta no es solo "sí" — es mostrar que sabes CUÁNDO usarlas y cuándo NO. Eso es lo que aprenderás aquí.
DuckDB va a ser tu compañero durante toda esta skill. Su velocidad te permite iterar rápido: prueba una query, modifícala, vuelve a ejecutar. Sin esperas, sin frustraciones. El motor está listo — ahora toca dominar las window functions.
## ejercicios
generate_series avanzado: datos de prueba profesionales
Crea una tabla temporal "sensores" con 1000 lecturas usando generate_series. Columnas: id, sensor_id (1-10 cíclico), timestamp (cada minuto desde 2024-01-01), temperatura (15-35 con variación) y estado (normal/alerta). Luego muestra el promedio de temperatura por sensor.
💡 Resultado esperado
sensor_id lecturas temp_media temp_min temp_max
1 100 27.23 20.2 34.9
2 100 27.87 20.1 35.0
3 100 27.86 20.1 35.0Explorar el dataset completo del e-commerce
Explora el dataset que usarás en toda la skill. Responde: 1) ¿Cuántas tablas hay? (SHOW TABLES), 2) ¿Cuál es el rango de fechas en pedidos? (MIN/MAX), 3) ¿Cuántos pedidos hay por estado? 4) ¿Cuáles son los 3 canales de adquisición más frecuentes de clientes?
JOIN con métricas: clientes y pedidos
El director comercial quiere un informe de clientes VIP vs no-VIP. Calcula para cada grupo (es_vip): número de clientes, total de pedidos, gasto total, ticket medio y tasa de cancelación (% pedidos cancelados). Usa JOIN entre clientes y pedidos.
Capacidades analíticas de DuckDB
Demuestra 3 capacidades avanzadas de DuckDB en una sola query: 1) Usa una CTE para calcular el gasto por cliente (incluye los que no han comprado), 2) Clasifícalos en segmentos (VIP: >400, Regular: 100-400, Bajo: <100), 3) Muestra cuántos clientes hay por segmento y el gasto medio de cada uno.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...