IOKELU
Nivel: Avanzado
💡 Prueba las consultas:
Puedes ejecutar cualquier Window Function en nuestra consola interactiva: Abrir consola SQL →

PARTITION BY en SQL: análisis por grupos sin agrupar filas

PARTITION BY divide los datos en grupos para aplicar funciones ventana sin perder filas. Es esencial para rankings por categoría, acumulados por grupo, comparaciones internas y análisis avanzado.

1. ¿Qué es PARTITION BY?

PARTITION BY divide los datos en grupos para que las funciones ventana operen dentro de cada grupo, sin eliminar filas.


SELECT categoria, producto, precio,
       AVG(precio) OVER(PARTITION BY categoria) AS promedio_categoria
FROM productos;
    

2. Sintaxis


funcion_ventana() OVER(
    PARTITION BY columna
    ORDER BY columna
)
    

3. Ranking por grupos


SELECT categoria, producto, ventas,
       RANK() OVER(
           PARTITION BY categoria
           ORDER BY ventas DESC
       ) AS ranking_categoria
FROM productos;
    

4. Acumulados por grupo


SELECT vendedor, mes, ventas,
       SUM(ventas) OVER(
           PARTITION BY vendedor
           ORDER BY mes
       ) AS acumulado_vendedor
FROM ventas_mensuales;
    

5. Comparación entre filas del mismo grupo


SELECT vendedor, mes, ventas,
       ventas - LAG(ventas) OVER(
           PARTITION BY vendedor
           ORDER BY mes
       ) AS diferencia_mes
FROM ventas_mensuales;
    

6. Frames dentro de PARTITION BY


SELECT categoria, producto, ventas,
       AVG(ventas) OVER(
           PARTITION BY categoria
           ORDER BY producto
           ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
       ) AS promedio_movil
FROM productos;
    

7. Ejemplos prácticos


-- Ranking por ciudad
SELECT ciudad, vendedor, ventas,
       ROW_NUMBER() OVER(
           PARTITION BY ciudad
           ORDER BY ventas DESC
       ) AS ranking_ciudad
FROM vendedores;

-- Acumulado por cliente
SELECT cliente, fecha, compra,
       SUM(compra) OVER(
           PARTITION BY cliente
           ORDER BY fecha
       ) AS acumulado_cliente
FROM compras;

-- Comparación interna por categoría
SELECT categoria, producto, precio,
       precio - AVG(precio) OVER(PARTITION BY categoria) AS diferencia_categoria
FROM productos;
    

8. Ejercicios para practicar

9. Mini‑proyecto: Ranking por ciudad y acumulado por cliente


SELECT ciudad, vendedor, ventas,
       RANK() OVER(
           PARTITION BY ciudad
           ORDER BY ventas DESC
       ) AS ranking_ciudad,
       SUM(ventas) OVER(
           PARTITION BY ciudad
           ORDER BY vendedor
       ) AS acumulado_ciudad
FROM vendedores;
    

10. Errores comunes

11. Preguntas frecuentes

¿PARTITION BY agrupa filas?

No, solo divide los datos para análisis interno.

¿Es obligatorio usar ORDER BY?

Para funciones como RANK, LAG, LEAD, sí.


Siguiente guía

SQL Avanzado – ORDER BY avanzado →