(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
SQL Server

T-SQL avanzado: CTEs, window functions y APPLY para análisis complejo

João Barros 30 de October de 2025 2 min de lectura

Muchos analistas conocen GROUP BY y JOIN, pero las funcionalidades avanzadas de T-SQL — CTEs recursivas, window functions y APPLY — resuelven en pocas líneas problemas que de otro modo exigirían cursores o código imperativo.

CTEs recursivas — jerarquías en SQL

-- Jerarquía de departamentos con nivel y ruta completa
WITH CTE_Jerarquia AS (
    -- Ancla: raíz de la jerarquía
    SELECT id_dept, nombre, id_dept_padre, 0 AS nivel, CAST(nombre AS VARCHAR(500)) AS ruta
    FROM dbo.Departamentos WHERE id_dept_padre IS NULL

    UNION ALL

    -- Parte recursiva
    SELECT d.id_dept, d.nombre, d.id_dept_padre,
           h.nivel + 1,
           CAST(h.ruta + ' > ' + d.nombre AS VARCHAR(500))
    FROM dbo.Departamentos d
    JOIN CTE_Jerarquia h ON d.id_dept_padre = h.id_dept
)
SELECT * FROM CTE_Jerarquia ORDER BY ruta;

Window Functions — análisis sin GROUP BY

SELECT
    id_cliente,
    fecha_venta,
    importe,
    -- Ranking dentro de cada cliente
    ROW_NUMBER()  OVER (PARTITION BY id_cliente ORDER BY fecha_venta DESC) AS rn,
    -- Total acumulado
    SUM(importe)  OVER (PARTITION BY id_cliente ORDER BY fecha_venta ROWS UNBOUNDED PRECEDING) AS total_acum,
    -- Comparación con la venta anterior
    LAG(importe, 1) OVER (PARTITION BY id_cliente ORDER BY fecha_venta) AS venta_anterior,
    importe - LAG(importe, 1) OVER (PARTITION BY id_cliente ORDER BY fecha_venta) AS variacion
FROM dbo.Ventas;

CROSS APPLY — joins con funciones y subconsultas correlacionadas

-- Últimas 3 compras de cada cliente (imposible con un JOIN simple)
SELECT c.nombre, v.fecha_venta, v.importe
FROM dbo.Clientes c
CROSS APPLY (
    SELECT TOP 3 fecha_venta, importe
    FROM dbo.Ventas
    WHERE id_cliente = c.id_cliente
    ORDER BY fecha_venta DESC
) v;

-- OUTER APPLY incluye clientes sin compras (como LEFT JOIN)

Conclusión

Las CTEs mejoran la legibilidad de consultas complejas, las window functions eliminan la necesidad de subconsultas para análisis comparativos, y APPLY resuelve problemas de top-N por grupo de forma elegante. Juntas, estas tres funcionalidades cubren el 90% de los casos de análisis avanzado en T-SQL.

Compartir: