Capítulo 7
SQL Avanzado

Analítica Avanzada (OLAP) y
Common Table Expressions

En este capítulo, rompemos la barrera de "una fila por grupo". Aprenderás a usar Window Functions para realizar cálculos complejos como acumulados anuales (YTD), rankings y comparativas mes a mes (MoM) sin perder el detalle de los datos, usando la potencia de OVER() y organizando tu código con CTEs.

2. El Concepto de "Ventana" (Window)

¿Cómo mirar "alrededor" de la fila actual sin agrupar todo?

GROUP BY vs. PARTITION BY

GROUP BY Colapsa Filas

Reduce múltiples filas en una sola. Pierdes el detalle individual.
Ej: "Suma total de ventas por mes".

OVER(PARTITION BY) Mantiene Filas

Mantiene todas las filas originales pero añade una columna con el cálculo agregado repetido o acumulado.
Ej: "Venta de esta factura vs el promedio del mes".

Anatomía de la Ventana

graph TD T[Tabla Completa] --> P1[Partición A: Ventas Enero] T --> P2[Partición B: Ventas Febrero] subgraph "Ventana-Window" P1 --> R1[Fila 1: $100] P1 --> R2[Fila 2: $200] R1 -.->|SUM OVER...| CALC[Acumulado: $100] R2 -.->|SUM OVER...| CALC2[Acumulado: $300] end style P1 fill:#dbeafe,stroke:#2563eb style CALC fill:#dcfce7,stroke:#22c55e style CALC2 fill:#dcfce7,stroke:#22c55e

3. Funciones de Ranking

Diferencias críticas en cómo enumerar filas con empates.

Valor (Ventas) ROW_NUMBER() RANK() DENSE_RANK() Explicación
$5000 1 1 1 Líder indiscutible.
$3000 2 2 2 Empate detectado.
$3000 3 2 2 ROW_NUMBER desempató forzosamente.
$1000 4 4 3 RANK salta (2->4). DENSE_RANK no salta (2->3).

4. Viaje en el Tiempo: LEAD & LAG

Acceder a filas anteriores o posteriores sin hacer Self-Joins.

SQL Editor
SELECT

  Mes,
  VentaActual,
  LAG(VentaActual) OVER (ORDER BY Mes) AS VentaMesAnterior,
  VentaActual - LAG(VentaActual) OVER (ORDER BY Mes) AS Diferencia
FROM
VentasMensuales;
Fila N (Feb)
LAG(1)
Trae el valor de Enero a la fila de Febrero.
Fila N (Feb)
LEAD(1)
Trae el valor de Marzo a la fila de Febrero.

5. Common Table Expressions (CTEs)

El fin de las subconsultas anidadas ilegibles.

Un CTE (definido con WITH) crea una tabla temporal que solo existe durante la ejecución de la consulta. Es vital para limpiar datos antes de analizarlos.

WITH VentasLimpias AS (
    -- Paso 1: Limpieza
    SELECT 
        UPPER(Cliente) as Cliente,
        CAST(Fecha AS DATE) as FechaVenta,
        Monto
    FROM RawData
),
VentasMensuales AS (
    -- Paso 2: Agregación
    SELECT 
        YEAR(FechaVenta) as Anio,
        MONTH(FechaVenta) as Mes,
        SUM(Monto) as Total
    FROM VentasLimpias
    GROUP BY YEAR(FechaVenta), MONTH(FechaVenta)
)
-- Paso 3: Análisis Final
SELECT * FROM VentasMensuales;
Reto Final de Módulo

The Financial Analyst Protocol

El CFO necesita un reporte urgente. Excel colapsó. Debes generar una Consulta Única que muestre el rendimiento histórico de ventas.

Requerimientos del Query (Single SELECT):

  • 1 Limpieza (CTE): Usa el dataset raw_sales_dump.csv normalizado.
  • 2 Venta Mensual: Agrupa las ventas por Año y Mes.
  • 3 Growth (MoM): Usa LAG() para calcular el % de crecimiento respecto al mes anterior.
  • 4 Acumulado (YTD): Usa SUM() OVER(PARTITION BY Anio ORDER BY Mes) para el Running Total.