Saltar al contenido

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:

  1. 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.
  2. 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.
  3. 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.
En analítica pura, DuckDB es un orden de magnitud más rápido que PostgreSQL.

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;
3
4-- Leer Parquet (formato columnar comprimido)
5SELECT region, SUM(importe) AS total
6FROM read_parquet('data/ventas/*.parquet')
7GROUP BY region;
8
9-- Leer JSON
10SELECT * FROM read_json_auto('eventos.json') LIMIT 10;
11
12-- ¿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 disponibles
2SHOW TABLES;
3
4-- Conteo rápido de cada tabla
5SELECT 'clientes' AS tabla, COUNT(*) AS filas FROM clientes
6UNION ALL SELECT 'pedidos', COUNT(*) FROM pedidos
7UNION ALL SELECT 'productos', COUNT(*) FROM productos
8UNION ALL SELECT 'categorias', COUNT(*) FROM categorias
9UNION ALL SELECT 'lineas_pedido', COUNT(*) FROM lineas_pedido
10UNION ALL SELECT 'vendedores', COUNT(*) FROM vendedores
11UNION ALL SELECT 'ventas_diarias', COUNT(*) FROM ventas_diarias
12UNION ALL SELECT 'ventas_mensuales', COUNT(*) FROM ventas_mensuales
13UNION 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 gasto
2SELECT
3 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_medio
8FROM clientes c
9JOIN pedidos p ON p.cliente_id = c.id
10WHERE p.estado = 'completado'
11GROUP BY c.ciudad
12ORDER 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:

  1. 01.Entender el problema que resuelven las window functions (lección 2)
  2. 02.Dominar ROW_NUMBER, RANK y DENSE_RANK (lección 3)
  3. 03.Comparar con LAG y LEAD (lección 4)
  4. 04.Calcular sumas progresivas y medias móviles (lección 5)
  5. 05.Leer planes de ejecución con EXPLAIN (lección 6)
  6. 06.Entender índices y optimización (lección 7)
  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

[01]

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.0
Cargando editor...
[02]

Explorar 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?

Cargando editor...
[03]

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.

Cargando editor...
[04]

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.

Cargando editor...

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...