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

T-SQL avançado: CTEs, window functions e APPLY para análise complexa

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

Muitos analistas conhecem GROUP BY e JOIN, mas as funcionalidades avançadas do T-SQL — CTEs recursivas, window functions e APPLY — permitem resolver em poucas linhas problemas que de outro modo exigiriam cursores ou código imperativo.

CTEs Recursivas — hierarquias em SQL

-- Hierarquia de departamentos com nível e caminho completo
WITH CTE_Hierarquia AS (
    -- Âncora: raiz da hierarquia
    SELECT id_dept, nome, id_dept_pai, 0 AS nivel, CAST(nome AS VARCHAR(500)) AS caminho
    FROM dbo.Departamentos WHERE id_dept_pai IS NULL

    UNION ALL

    -- Parte recursiva
    SELECT d.id_dept, d.nome, d.id_dept_pai,
           h.nivel + 1,
           CAST(h.caminho + ' > ' + d.nome AS VARCHAR(500))
    FROM dbo.Departamentos d
    JOIN CTE_Hierarquia h ON d.id_dept_pai = h.id_dept
)
SELECT * FROM CTE_Hierarquia ORDER BY caminho;

Window Functions — análise sem GROUP BY

SELECT
    id_cliente,
    data_venda,
    valor,
    -- Ranking dentro de cada cliente
    ROW_NUMBER()  OVER (PARTITION BY id_cliente ORDER BY data_venda DESC) AS rn,
    -- Total acumulado
    SUM(valor)    OVER (PARTITION BY id_cliente ORDER BY data_venda ROWS UNBOUNDED PRECEDING) AS total_acum,
    -- Comparação com venda anterior
    LAG(valor, 1) OVER (PARTITION BY id_cliente ORDER BY data_venda) AS venda_anterior,
    valor - LAG(valor, 1) OVER (PARTITION BY id_cliente ORDER BY data_venda) AS variacao
FROM dbo.Vendas;

CROSS APPLY — joins com funções e subqueries correlacionadas

-- Últimas 3 compras de cada cliente (impossível com JOIN simples)
SELECT c.nome, v.data_venda, v.valor
FROM dbo.Clientes c
CROSS APPLY (
    SELECT TOP 3 data_venda, valor
    FROM dbo.Vendas
    WHERE id_cliente = c.id_cliente
    ORDER BY data_venda DESC
) v;

-- OUTER APPLY inclui clientes sem compras (como LEFT JOIN)

Conclusão

CTEs melhoram a legibilidade de queries complexas, window functions eliminam a necessidade de subconsultas para análises comparativas, e APPLY resolve problemas de top-N por grupo de forma elegante. Juntas, estas três funcionalidades cobrem 90% dos casos de análise avançada em T-SQL.

Partilhar: