Las funciones de ventana en SQL son una poderosa herramienta que permite realizar cálculos sobre un conjunto de filas relacionadas con la fila actual. A diferencia de las funciones de agregación tradicionales, las funciones de ventana no agrupan los resultados en una sola fila, sino que mantienen el contexto de cada fila individual.
Conceptos Clave
- Partición: Un conjunto de filas sobre las cuales se aplica la función de ventana. Es similar a una cláusula
GROUP BY
, pero no agrupa los resultados en una sola fila. - Orden: La secuencia en la que se procesan las filas dentro de cada partición.
- Ventana: Un marco de filas que se define en relación con la fila actual.
Sintaxis Básica
La sintaxis básica de una función de ventana es la siguiente:
función_ventana() OVER ( [PARTITION BY expresión1, expresión2, ...] [ORDER BY expresión1 [ASC|DESC], expresión2 [ASC|DESC], ...] [frame_clause] )
función_ventana()
: La función de ventana que se va a aplicar (por ejemplo,ROW_NUMBER()
,RANK()
,SUM()
, etc.).PARTITION BY
: Opcional. Divide el conjunto de resultados en particiones a las que se aplica la función de ventana.ORDER BY
: Opcional. Define el orden de las filas dentro de cada partición.frame_clause
: Opcional. Define un marco de filas en relación con la fila actual.
Ejemplos Prácticos
- ROW_NUMBER()
La función ROW_NUMBER()
asigna un número único a cada fila dentro de la partición de un conjunto de resultados.
SELECT empleado_id, nombre, departamento, salario, ROW_NUMBER() OVER (PARTITION BY departamento ORDER BY salario DESC) AS fila_numero FROM empleados;
Explicación:
PARTITION BY departamento
: Divide las filas por departamento.ORDER BY salario DESC
: Ordena las filas dentro de cada departamento por salario en orden descendente.ROW_NUMBER()
: Asigna un número de fila único a cada fila dentro de la partición.
- RANK() y DENSE_RANK()
Las funciones RANK()
y DENSE_RANK()
asignan un rango a cada fila dentro de la partición de un conjunto de resultados. La diferencia es que RANK()
puede saltar números en el rango, mientras que DENSE_RANK()
no.
SELECT empleado_id, nombre, departamento, salario, RANK() OVER (PARTITION BY departamento ORDER BY salario DESC) AS rango, DENSE_RANK() OVER (PARTITION BY departamento ORDER BY salario DESC) AS rango_denso FROM empleados;
Explicación:
RANK()
: Asigna un rango a cada fila, pero puede haber saltos en los números.DENSE_RANK()
: Asigna un rango a cada fila sin saltos en los números.
- SUM() con Ventanas
La función SUM()
puede usarse como una función de ventana para calcular sumas acumulativas.
SELECT empleado_id, nombre, departamento, salario, SUM(salario) OVER (PARTITION BY departamento ORDER BY salario DESC) AS suma_acumulativa FROM empleados;
Explicación:
SUM(salario)
: Calcula la suma de los salarios.OVER (PARTITION BY departamento ORDER BY salario DESC)
: Aplica la suma acumulativa dentro de cada departamento, ordenando por salario en orden descendente.
Ejercicio Práctico
Ejercicio 1: Calcular el Salario Acumulativo
Dado el siguiente conjunto de datos en la tabla empleados
:
empleado_id | nombre | departamento | salario |
---|---|---|---|
1 | Ana | Ventas | 5000 |
2 | Juan | Ventas | 6000 |
3 | Pedro | Marketing | 4500 |
4 | María | Marketing | 5500 |
5 | Luis | Ventas | 7000 |
Escribe una consulta para calcular el salario acumulativo por departamento.
Solución:
SELECT empleado_id, nombre, departamento, salario, SUM(salario) OVER (PARTITION BY departamento ORDER BY salario) AS salario_acumulativo FROM empleados;
Resultado Esperado:
empleado_id | nombre | departamento | salario | salario_acumulativo |
---|---|---|---|---|
1 | Ana | Ventas | 5000 | 5000 |
2 | Juan | Ventas | 6000 | 11000 |
5 | Luis | Ventas | 7000 | 18000 |
3 | Pedro | Marketing | 4500 | 4500 |
4 | María | Marketing | 5500 | 10000 |
Conclusión
Las funciones de ventana en PostgreSQL son herramientas poderosas para realizar cálculos avanzados sobre conjuntos de datos. Permiten mantener el contexto de cada fila mientras se realizan operaciones como la numeración de filas, el cálculo de rangos y sumas acumulativas. Al dominar estas funciones, puedes realizar análisis de datos más complejos y obtener información más detallada de tus bases de datos.
En el próximo módulo, exploraremos las Expresiones de Tabla Común (CTEs), que son otra herramienta avanzada para estructurar y simplificar consultas SQL complejas.
Curso de PostgreSQL
Módulo 1: Introducción a PostgreSQL
Módulo 2: Operaciones Básicas de SQL
- Creando Bases de Datos y Tablas
- Insertando Datos
- Consultando Datos
- Actualizando Datos
- Eliminando Datos
Módulo 3: Consultas Avanzadas de SQL
Módulo 4: Diseño de Bases de Datos y Normalización
Módulo 5: Características Avanzadas de PostgreSQL
Módulo 6: Ajuste de Rendimiento y Optimización
- Optimización de Consultas
- Estrategias de Indexación
- Análisis del Rendimiento de Consultas
- Vacuuming y Mantenimiento
Módulo 7: Seguridad y Gestión de Usuarios
Módulo 8: Trabajando con JSON y Características NoSQL
Módulo 9: Extensiones y Herramientas Avanzadas
- PostGIS para Datos Geoespaciales
- Búsqueda de Texto Completo
- Wrappers de Datos Externos
- PL/pgSQL y Otros Lenguajes Procedurales