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

  1. 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.
  2. Orden: La secuencia en la que se procesan las filas dentro de cada partición.
  3. 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

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

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

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

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

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

Módulo 10: Estudios de Caso y Aplicaciones del Mundo Real

© Copyright 2024. Todos los derechos reservados