Particiones en las funciones de ventana
En el artículo anterior ya mencionamos brevemente qué son las particiones y cómo se usan en las funciones de ventana. Ha llegado el momento de verlas con más detalle 🤓.
Qué es una partición
Sirven para segmentar los datos y permiten hacer un análisis más detallado y cálculos como agregaciones o rankings dentro de cada uno de esos grupos.
Por ejemplo, si dividimos en particiones por tipo una tabla con los precios de los alojamientos, podemos calcular en una columna aparte el precio medio de cada tipo de alojamiento.

Uso de particiones en SQL
Para usar una partición junto con una función de ventana, hay que seguir esta sintaxis:
SELECT funcion_ventana(campo_tabla)
OVER (
PARTITION BY columna_particion [, ...]
)- [ ]parte opcional
- ...se puede repetir
- funcion_ventana
La función que se calcula sobre la ventana, por ejemplo AVG o SUM.
- campo_tabla
La columna cuyos valores se pasan a la función, por ejemplo price en AVG(price).
- columna_particion
La columna por la que las filas se dividen en particiones: las filas con el mismo valor van a la misma. Puedes indicar varias columnas separadas por comas.
Ejemplo de uso
Veamos ahora con un ejemplo sencillo cómo se usa una partición junto con una función de ventana.
Para ello, tomemos la tabla Rooms, en concreto las columnas home_type y price:
MySQL 8.4SELECT home_type, price FROM Rooms;
Podemos ver que todos los alojamientos en alquiler se dividen en 3 categorías: «Private room», «Entire home/apt» y «Shared room».
Cada categoría de alojamiento tiene su propio rango de precios. Para saber el precio medio de una categoría concreta y compararlo con el precio actual, las funciones de ventana vienen como anillo al dedo.
Para ello, añadimos a nuestra tabla de resultados otra columna, avg_price, que calculará el precio medio por categoría. Quedaría así:
MySQL 8.4SELECT home_type, price, AVG(price) OVER (PARTITION BY home_type) AS avg_price FROM Rooms
¿Qué ocurre exactamente en la línea que hemos añadido?
- PARTITION BY home_type divide todos los registros en particiones distintas según los valores únicos de la columna home_type.
- Después, para cada registro, AVG(price) calcula el precio medio (price) dentro de su partición (home_type).
El resultado de esta parte de la consulta es la columna avg_price, en la que, para cada registro, aparece el precio medio de su categoría de alojamiento (home_type).
Particiones por varias columnas
También se puede particionar por varias columnas. Esto permite crear segmentos de análisis más complejos y precisos.
Por ejemplo, para nuestra tabla Rooms podemos crear particiones a partir de 2 columnas: la categoría de alojamiento home_type y si el alojamiento tiene televisor, has_tv.
Ejemplo de consulta con particiones por dos columnas:
MySQL 8.4SELECT home_type, has_tv, price, AVG(price) OVER (PARTITION BY home_type, has_tv) AS avg_price FROM Rooms
Aquí, PARTITION BY home_type, has_tv crea particiones únicas para cada combinación de home_type y has_tv, lo que permite calcular el precio medio de la categoría de alojamiento actual con o sin televisor.
