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

  1. Partición: Un subconjunto de filas dentro del conjunto de resultados sobre el cual se aplica la función de ventana.
  2. Orden: La secuencia en la que se procesan las filas dentro de cada partición.
  3. 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

  1. 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;

  1. 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.

SELECT 
    empleado_id,
    nombre,
    salario,
    RANK() OVER (ORDER BY salario DESC) AS rango
FROM 
    empleados;

  1. 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;

  1. NTILE()

Divide el conjunto de resultados en un número especificado de grupos y asigna un número de grupo a cada fila.

SELECT 
    empleado_id,
    nombre,
    salario,
    NTILE(4) OVER (ORDER BY salario DESC) AS grupo
FROM 
    empleados;

  1. 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;

  1. 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

Módulo 3: Trabajando con múltiples tablas

Módulo 4: Filtrado avanzado de datos

Módulo 5: Manipulación de datos

Módulo 6: Funciones avanzadas de SQL

Módulo 7: Subconsultas y consultas anidadas

Módulo 8: Índices y optimización de rendimiento

Módulo 9: Transacciones y concurrencia

Módulo 10: Temas avanzados

Módulo 11: SQL en la práctica

Módulo 12: Proyecto final

© Copyright 2024. Todos los derechos reservados