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.
Tabla de contenidos
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
- Crea un ranking por categoría.
- Calcula acumulados por vendedor.
- Compara ventas con el mes anterior dentro del mismo vendedor.
- Calcula un promedio móvil por categoría.
- Explica para qué sirve PARTITION BY.
SELECT categoria, producto, ventas,
RANK() OVER(
PARTITION BY categoria
ORDER BY ventas DESC
)
FROM productos;
SELECT vendedor, mes, ventas,
SUM(ventas) OVER(
PARTITION BY vendedor
ORDER BY mes
)
FROM ventas_mensuales;
SELECT vendedor, mes, ventas,
LAG(ventas) OVER(
PARTITION BY vendedor
ORDER BY mes
)
FROM ventas_mensuales;
SELECT categoria, producto, ventas,
AVG(ventas) OVER(
PARTITION BY categoria
ORDER BY producto
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
)
FROM productos;
-- PARTITION BY sirve para análisis por grupos sin agrupar filas.
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
- Confundir PARTITION BY con GROUP BY.
- No usar ORDER BY dentro de OVER().
- Usar PARTITION BY en columnas incorrectas.
- Olvidar alias en funciones complejas.
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í.