Las particiones en el contexto de bases de datos y funciones de ventana (window functions) son una manera de dividir un conjunto de datos en subgrupos (particiones más pequeñas) para realizar cálculos independientemente dentro de cada grupo. Esto permite que las operaciones de las funciones se apliquen de forma aislada en cada partición en lugar de en todo el conjunto de datos.
¿Qué es una partición?
- Es un subgrupo de filas dentro de una consulta que se define usando la cláusula
PARTITION BY.
- Cada partición actúa como un espacio independiente donde las funciones de ventana realizan sus cálculos.
- Las filas de una partición comparten un criterio en común (por ejemplo, todas las filas del mismo departamento o región).
Sintaxis general
función([parámetros]) OVER (
PARTITION BY columna1, columna2
[ORDER BY columna3 ASC|DESC]
)
PARTITION BY: Define cómo dividir las filas en particiones (grupos).
ORDER BY: Dentro de cada partición, define el orden de las filas (opcional).
función: Cualquier función de ventana que se quiera aplicar (por ejemplo, SUM, ROW_NUMBER, AVG, etc.).
Ejemplo básico: Sin partición
Sin partición, una función de ventana opera sobre todo el conjunto de datos.
Caso: Calcular una suma acumulativa
SELECT nombre, departamento, salario,
SUM(salario) OVER (ORDER BY salario ASC) AS suma_acumulativa
FROM empleados;
- Resultado: Se calcula una suma acumulativa para todos los empleados, independientemente del departamento.
Ejemplo: Con partición
Cuando usas PARTITION BY, las funciones de ventana calculan los valores independientemente para cada grupo.
Caso: Suma acumulativa por departamento
SELECT nombre, departamento, salario,
SUM(salario) OVER (PARTITION BY departamento ORDER BY salario ASC) AS suma_acumulativa
FROM empleados;
- PARTITION BY departamento: Divide las filas por departamento.
- ORDER BY salario: Calcula la suma acumulativa dentro de cada departamento, ordenando por salario.
Resultado: La suma acumulativa se reinicia para cada departamento.
Ventajas de particionar los datos
- Aislamiento de cálculos: Cada partición es independiente, lo que permite realizar cálculos específicos para cada grupo.
- Mayor granularidad: Permite analizar datos de manera más detallada.
- Flexibilidad: Puedes combinar particiones con órdenes para realizar cálculos complejos, como promedios móviles o rankings dentro de subgrupos.
Funciones que soportan particiones
Las particiones son comunes en muchas funciones de ventana como:
- Agregaciones acumulativas:
SUM, AVG, COUNT, MAX, MIN
- Rankings:
ROW_NUMBER, RANK, DENSE_RANK, NTILE
- Acceso a filas:
LAG, LEAD, FIRST_VALUE, LAST_VALUE
- Porcentajes:
Ejemplo práctico
Supongamos que tienes una tabla de ventas (ventas) con las columnas region, mes y total_venta. Quieres calcular las ventas acumulativas por región.
SELECT region, mes, total_venta,
SUM(total_venta) OVER (PARTITION BY region ORDER BY mes) AS ventas_acumuladas
FROM ventas;
- PARTITION BY region: Divide las filas por región.
- ORDER BY mes: Calcula las ventas acumulativas de forma cronológica dentro de cada región.
Resultado:
RegiónMesTotal VentaVentas AcumuladasNorteEnero10,00010,000NorteFebrero15,00025,000SurEnero8,0008,000SurFebrero12,00020,000
¿Qué sucede si no se especifica PARTITION BY?
- Si no se usa
PARTITION BY, las funciones de ventana operan sobre todas las filas de la tabla como una sola partición.
- Esto es útil si quieres un cálculo global en lugar de uno segmentado.
Combinando particiones y ranking
Puedes usar PARTITION BY junto con rankings para enumerar filas dentro de particiones.
SELECT nombre, departamento, salario,
ROW_NUMBER() OVER (PARTITION BY departamento ORDER BY salario DESC) AS ranking
FROM empleados;
Resultado: Enumera los empleados en cada departamento, ordenados por salario de mayor a menor.
Consideraciones al usar particiones
- Rendimiento: Las particiones pueden ser costosas en tablas grandes. Asegúrate de tener índices adecuados en las columnas utilizadas.
- Criterios lógicos: Usa columnas significativas para las particiones, como categorías, regiones o períodos.
- Flexibilidad: Puedes usar múltiples columnas en
PARTITION BY para definir particiones más específicas.