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.
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 |
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 |
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 :
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 :
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 |
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 |
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 |
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!