paint-brush
Funciones de ventana SQL: una revisión rápida con ejemplospor@luca1iu
Nueva Historia

Funciones de ventana SQL: una revisión rápida con ejemplos

por Luca Liu5m2025/01/05
Read on Terminal Reader

Demasiado Largo; Para Leer

Las funciones de ventana son una característica potente de SQL que se utiliza para realizar cálculos en un conjunto de filas relacionadas con la fila actual. A diferencia de las funciones de agregación, las funciones de ventana no agrupan filas en una única salida. Devuelven un resultado para cada fila manteniendo el contexto del conjunto de datos.
featured image - Funciones de ventana SQL: una revisión rápida con ejemplos
Luca Liu HackerNoon profile picture


Introducción

Las funciones de ventana son una característica potente de SQL que se utiliza para realizar cálculos en un conjunto de filas relacionadas con la fila actual. A diferencia de las funciones de agregación, las funciones de ventana no agrupan filas en una única salida, sino que devuelven un resultado para cada fila manteniendo el contexto del conjunto de datos.


En este artículo, exploraremos algunas funciones de ventana SQL comúnmente utilizadas ( ROW_NUMBER() , RANK() , DENSE_RANK() , NTILE() , LEAD() y LAG() ) con ejemplos.

Tabla de muestra: Datos de ventas

Utilizaremos la siguiente tabla de Ventas para demostrar las funciones de ventana:

ID de venta

ID de cliente

Producto

Región

Cantidad

Fecha de venta

1

101

Computadora portátil

Norte

1200

5 de enero de 2023

2

102

Tableta

Norte

800

15 de febrero de 2023

3

103

Teléfono

Norte

800

10-03-2023

4

104

Tableta

Norte

500

01-04-2023

5

105

Computadora portátil

Sur

1300

5 de mayo de 2023

6

106

Tableta

Sur

700

20 de junio de 2023

7

107

Teléfono

Oeste

900

15 de julio de 2023

8

108

Computadora portátil

Este

1300

10 de agosto de 2023

1. NÚMERO_DE_FILA()

La función ROW_NUMBER() asigna un número único a cada fila dentro de una partición, ordenada por una columna específica.


Tarea : Asignar un número de fila único a cada venta dentro de una región según el monto de la venta (de mayor a menor).

 SELECT SalesID, Region, Amount, ROW_NUMBER() OVER (PARTITION BY Region ORDER BY Amount DESC) AS RowNum FROM Sales;

Resultado :

ID de venta

Región

Cantidad

Número de fila

1

Norte

1200

1

2

Norte

800

2

3

Norte

800

3

4

Norte

500

4

5

Sur

1300

1

6

Sur

700

2

7

Oeste

900

1

8

Este

1300

1

2. RANGO()

La función RANK() asigna un rango a cada fila dentro de una partición. Las filas con los mismos valores reciben el mismo rango y se omite el siguiente rango.


Tarea : Clasificar las ventas dentro de cada región por monto (de mayor a menor).

 SELECT SalesID, Region, Amount, RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS Rank FROM Sales;

Resultado :

ID de venta

Región

Cantidad

Rango

1

Norte

1200

1

2

Norte

800

2

3

Norte

800

2

4

Norte

500

4

5

Sur

1300

1

6

Sur

700

2

7

Oeste

900

1

8

Este

1300

1

Característica clave :

  • Para la región Norte, ambas filas de Cantidad = 800 comparten el rango 2.


  • Se omite el siguiente rango (es decir, falta el rango 3) y se salta al 4.

3. RANGO_DENSO()

La función DENSE_RANK() asigna rangos como RANK(), pero no omite rangos después de empates.


Tarea : Asignar rangos densos a las ventas dentro de cada región por monto (de mayor a menor).

 SELECT SalesID, Region, Amount, DENSE_RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS DenseRank FROM Sales;

Resultado :

ID de venta

Región

Cantidad

Rango denso

1

Norte

1200

1

2

Norte

800

2

3

Norte

800

2

4

Norte

500

3

5

Sur

1300

1

6

Sur

700

2

7

Oeste

900

1

8

Este

1300

1

Característica clave :

  • Para la región Norte, ambas filas de Cantidad = 800 comparten el rango 2.


  • El siguiente rango es el 3, sin saltos de rango.

4. NTILE()

NTILE() divide filas en un número específico de grupos aproximadamente iguales.


Tarea : Divida todas las ventas en 4 grupos según el monto en orden descendente.

 SELECT SalesID, Amount, NTILE(4) OVER (ORDER BY Amount DESC) AS Quartile FROM Sales;

Resultado :

ID de venta

Cantidad

Cuartilla

5

1300

1

8

1300

1

1

1200

2

7

900

2

2

800

3

3

800

3

4

500

4

6

700

4

5. PLOMO()

LEAD() recupera el valor de la siguiente fila dentro de la misma partición.


Tarea : Comparar cada monto de venta con el monto de venta siguiente, ordenados por fecha de venta.

 SELECT SalesID, Amount, LEAD(Amount) OVER (ORDER BY SaleDate) AS NextAmount FROM Sales;

Resultado :

ID de venta

Cantidad

SiguienteCantidad

1

1200

800

2

800

800

3

800

500

4

500

1300

5

1300

700

6

700

900

7

900

1300

8

1300

NULO

6. RETRASO()

LAG() recupera el valor de la fila anterior dentro de la misma partición.


Tarea : Comparar cada monto de venta con el monto de venta anterior, ordenado por fecha de venta.

 SELECT SalesID, Amount, LAG(Amount) OVER (ORDER BY SaleDate) AS PrevAmount FROM Sales;

Resultado :

ID de venta

Cantidad

Cantidad anterior

1

1200

NULO

2

800

1200

3

800

800

4

500

800

5

1300

500

6

700

1300

7

900

700

8

1300

900

Conclusión

Las funciones de la ventana SQL como ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE(), LEAD() y LAG() proporcionan formas poderosas de analizar datos dentro de particiones.


Conclusiones clave:

  • ROW_NUMBER() asigna un identificador único para cada fila.
  • RANK() y DENSE_RANK() difieren en cómo manejan los empates (saltar vs. no saltar).
  • NTILE() es útil para dividir filas en grupos de estadísticas.
  • LEAD() y LAG() permiten comparaciones con filas adyacentes.


¡Al dominar estas funciones, podrás gestionar tareas complejas de análisis y clasificación de manera eficaz!


Gracias por tomarte el tiempo de explorar conmigo información relacionada con los datos. Aprecio tu compromiso. Si encuentras útil esta información, te invito a seguirme o conectarte conmigo en LinkedIn . ¡Que disfrutes explorando!