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 calculan valores para cada fila en el conjunto de resultados.
Conceptos Clave
- Partición: Un subconjunto de filas dentro del conjunto de resultados sobre el cual se aplica la función de ventana.
- Orden: La secuencia en la que se procesan las filas dentro de cada partición.
- Ventana: El rango de filas que se consideran para el cálculo de la función de ventana.
Sintaxis Básica
La sintaxis general para una función de ventana es:
<función_de_ventana>() OVER ( [PARTITION BY <expresión>] [ORDER BY <expresión>] [ROWS | RANGE BETWEEN <inicio> AND <fin>] )
- PARTITION BY: Divide el conjunto de resultados en particiones.
- ORDER BY: Define el orden de las filas dentro de cada partición.
- ROWS | RANGE: Define el rango de filas que se consideran para la función de ventana.
Ejemplos de Funciones de Ventana
ROW_NUMBER()
ROW_NUMBER()
Asigna un número de fila único a cada fila dentro de la partición de un conjunto de resultados.
SELECT empleado_id, nombre, salario, ROW_NUMBER() OVER (ORDER BY salario DESC) AS numero_fila FROM empleados;
RANK()
RANK()
Asigna un rango a cada fila dentro de la partición de un conjunto de resultados. Las filas con valores iguales reciben el mismo rango, y el siguiente rango se incrementa según el número de filas con el mismo rango.
DENSE_RANK()
DENSE_RANK()
Similar a RANK()
, pero sin saltos en los rangos.
SELECT empleado_id, nombre, salario, DENSE_RANK() OVER (ORDER BY salario DESC) AS rango_denso FROM empleados;
NTILE()
NTILE()
Divide el conjunto de resultados en un número especificado de grupos y asigna un número de grupo a cada fila.
LAG()
y LEAD()
LAG()
y LEAD()
Permiten acceder a la fila anterior o siguiente desde la fila actual.
-- LAG SELECT empleado_id, nombre, salario, LAG(salario, 1) OVER (ORDER BY salario DESC) AS salario_anterior FROM empleados; -- LEAD SELECT empleado_id, nombre, salario, LEAD(salario, 1) OVER (ORDER BY salario DESC) AS salario_siguiente FROM empleados;
SUM()
, AVG()
, MIN()
, MAX()
SUM()
, AVG()
, MIN()
, MAX()
Estas funciones de agregación también pueden usarse como funciones de ventana.
SELECT empleado_id, nombre, salario, SUM(salario) OVER (PARTITION BY departamento_id) AS suma_salario_departamento FROM empleados;
Ejercicio Práctico
Ejercicio 1: Calcular el Rango de Salarios
Dado un conjunto de datos de empleados, calcula el rango de salarios dentro de cada departamento.
SELECT departamento_id, empleado_id, nombre, salario, RANK() OVER (PARTITION BY departamento_id ORDER BY salario DESC) AS rango_salario FROM empleados;
Ejercicio 2: Comparar Salarios Anteriores y Siguientes
Para cada empleado, muestra su salario, el salario del empleado anterior y el salario del empleado siguiente.
SELECT empleado_id, nombre, salario, LAG(salario, 1) OVER (ORDER BY salario DESC) AS salario_anterior, LEAD(salario, 1) OVER (ORDER BY salario DESC) AS salario_siguiente FROM empleados;
Soluciones
Solución al Ejercicio 1
SELECT departamento_id, empleado_id, nombre, salario, RANK() OVER (PARTITION BY departamento_id ORDER BY salario DESC) AS rango_salario FROM empleados;
Solución al Ejercicio 2
SELECT empleado_id, nombre, salario, LAG(salario, 1) OVER (ORDER BY salario DESC) AS salario_anterior, LEAD(salario, 1) OVER (ORDER BY salario DESC) AS salario_siguiente FROM empleados;
Conclusión
Las funciones de ventana son extremadamente útiles para realizar cálculos avanzados y análisis dentro de conjuntos de datos en SQL. Permiten realizar operaciones complejas de manera eficiente y clara, proporcionando una gran flexibilidad en la manipulación y análisis de datos. Con la práctica, estas funciones se convertirán en una herramienta esencial en tu arsenal de SQL.
Curso de SQL
Módulo 1: Introducción a SQL
Módulo 2: Consultas básicas de SQL
- Instrucción SELECT
- Filtrando datos con WHERE
- Ordenando datos con ORDER BY
- Limitando resultados con LIMIT
Módulo 3: Trabajando con múltiples tablas
Módulo 4: Filtrado avanzado de datos
- Usando LIKE para coincidencia de patrones
- Operadores IN y BETWEEN
- Valores NULL y IS NULL
- Agregando datos con GROUP BY
- Cláusula HAVING
Módulo 5: Manipulación de datos
Módulo 6: Funciones avanzadas de SQL
Módulo 7: Subconsultas y consultas anidadas
- Introducción a subconsultas
- Subconsultas correlacionadas
- EXISTS y NOT EXISTS
- Usando subconsultas en cláusulas SELECT, FROM y WHERE
Módulo 8: Índices y optimización de rendimiento
- Entendiendo los índices
- Creación y gestión de índices
- Técnicas de optimización de consultas
- Análisis del rendimiento de consultas
Módulo 9: Transacciones y concurrencia
- Introducción a las transacciones
- Propiedades ACID
- Instrucciones de control de transacciones
- Manejo de concurrencia