Contenido de esta guía
Qué significa PARTITION BY
PARTITION BY forma grupos dentro de la cláusula OVER. Para cada fila, la función de ventana trabaja con las filas que comparten los mismos valores de partición.
A diferencia de GROUP BY, no reduce cada grupo a una única fila. El detalle original sigue visible junto con el promedio, total, posición u otra medida calculada para su grupo.
Estructura básica
funcion(...) OVER (
PARTITION BY columna_grupo
ORDER BY columna_orden
)PARTITION BY decide dónde se reinicia el cálculo. El ORDER BY interno decide el orden dentro de cada partición cuando la función lo necesita. El ORDER BY final de la consulta sigue siendo el responsable de ordenar la salida.
Ejemplo guiado: promedio por departamento
SELECT departamento,
nombre,
salario,
ROUND(AVG(salario) OVER (
PARTITION BY departamento
), 2) AS promedio_departamento
FROM empleados
WHERE departamento IN ('Marketing', 'Tecnología')
ORDER BY departamento, salario DESC;| departamento | nombre | salario | promedio_departamento |
|---|---|---|---|
| Marketing | Gonzalo Nieto | 31500 | 30750 |
| Marketing | Helena Costa | 30000 | 30750 |
| Tecnología | Carlos Peña | 46000 | 42500 |
| Tecnología | Diana León | 39000 | 42500 |
Cada empleado conserva su fila. El promedio se repite en todas las filas del mismo departamento porque se calcula sobre esa partición.
No es particionamiento físico de tablas. Aquí PARTITION BY solo organiza las filas disponibles para una función de ventana durante la consulta.
Errores frecuentes
Esperar que PARTITION BY ordene el resultado
El orden dentro de OVER define cómo trabaja la función, pero no garantiza por sí solo el orden final de las filas. Añade un ORDER BY al final de la consulta cuando el orden de presentación importe.
También debes distinguir la partición del marco de ventana: algunas funciones agregadas con un ORDER BY interno calculan un acumulado hasta la fila actual, no el total completo de la partición.
Comprueba lo aprendido
Numera los salarios de cada departamento
Muestra departamento, nombre, salario y una columna posicion. La persona con mayor salario de cada departamento debe recibir el número 1.
ROW_NUMBER().departamento.OVER.Solución razonada
SELECT departamento,
nombre,
salario,
ROW_NUMBER() OVER (
PARTITION BY departamento
ORDER BY salario DESC, nombre
) AS posicion
FROM empleados
ORDER BY departamento, posicion;PARTITION BY reinicia la cuenta y el orden interno coloca primero los salarios mayores. El nombre resuelve empates de forma reproducible.
Compatibilidad entre motores
Las funciones de ventana están disponibles en PostgreSQL, SQL Server y Oracle, en MySQL 8.0 o posterior y en SQLite 3.25 o posterior. El conjunto de funciones, las opciones de marco y el tratamiento de NULL pueden variar. Si una consulta se destina a varias versiones, comprueba la documentación concreta del motor.
Qué debes recordar
PARTITION BYcrea grupos de cálculo sin colapsar filas.- Se escribe dentro de
OVER. - El orden interno de la ventana y el orden final cumplen funciones distintas.
- Una partición y un marco de ventana no son exactamente lo mismo.