Tipos de Funciones de Ventana
Exploremos brevemente los principales tipos de funciones de ventana que se utilizan en SQL.
Funciones de agregación
Estas son las funciones de agregación estándar (AVG
, SUM
, MAX
, MIN
, COUNT
) utilizadas en un contexto de ventana. Ya hemos utilizado este tipo de función de ventana en el capítulo anterior.
Funciones de ranking
Las funciones de ranking en SQL son un tipo de función de ventana que permite asignar un rango a cada fila dentro de una partición de un conjunto de resultados. Estas funciones pueden ser extremadamente útiles para realizar cálculos y análisis ordenados.
-
RANK()
: Asigna un rango único a cada fila distinta dentro de la partición según la cláusulaORDER BY
. Las filas con valores iguales reciben el mismo rango, dejando huecos en la secuencia de rangos; -
DENSE_RANK()
: Similar a RANK(), pero sin huecos en la secuencia de rangos; -
NTILE(n)
: Divide las filas en una partición ordenada enn
grupos y asigna un número de grupo a cada fila.
Ejemplo
Clasificaremos las ventas según el Amount
para cada ProductID
en orden ascendente utilizando la función DENSE_RANK()
:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
La tabla de resultados contiene toda la información de la tabla principal y una columna adicional que proporciona el rango de cada venta para el producto en particular.
Funciones de comparación de valores
Las funciones de comparación de valores en ventanas en SQL se utilizan para comparar valores en la fila actual con valores en otras filas dentro de la misma partición.
Estas funciones son especialmente útiles para tareas que implican analizar tendencias, realizar cálculos basados en filas adyacentes o acceder a valores específicos de filas dentro de una ventana definida.
Existen varias funciones de comparación de valores en SQL:
LAG()
: Recupera el valor de una fila anterior en el conjunto de resultados sin necesidad de un self-join;LEAD()
: Recupera el valor de una fila posterior en el conjunto de resultados sin necesidad de un self-join;FIRST_VALUE()
: Devuelve el valor de la primera fila en el marco de la ventana;LAST_VALUE()
: Devuelve el valor de la última fila en el marco de la ventana.
Ejemplo
Utilicemos la función de comparación de valores de ventana LAG()
para calcular el cambio en el monto de ventas respecto a la venta anterior para cada producto:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Como resultado, podemos extraer fácilmente información sobre las diferencias de ventas para cada producto en particular sin utilizar subconsultas ni procedimientos almacenados.
También podemos calcular las diferencias para todas las ventas sin particionar utilizando la siguiente consulta:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Puedes observar que no incluimos la cláusula PARTITION BY
en el bloque OVER
. Esto significa que no queremos obtener los valores anteriores solo para un producto en particular, sino para todas las ventas en la tabla.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 4.35
Tipos de Funciones de Ventana
Desliza para mostrar el menú
Exploremos brevemente los principales tipos de funciones de ventana que se utilizan en SQL.
Funciones de agregación
Estas son las funciones de agregación estándar (AVG
, SUM
, MAX
, MIN
, COUNT
) utilizadas en un contexto de ventana. Ya hemos utilizado este tipo de función de ventana en el capítulo anterior.
Funciones de ranking
Las funciones de ranking en SQL son un tipo de función de ventana que permite asignar un rango a cada fila dentro de una partición de un conjunto de resultados. Estas funciones pueden ser extremadamente útiles para realizar cálculos y análisis ordenados.
-
RANK()
: Asigna un rango único a cada fila distinta dentro de la partición según la cláusulaORDER BY
. Las filas con valores iguales reciben el mismo rango, dejando huecos en la secuencia de rangos; -
DENSE_RANK()
: Similar a RANK(), pero sin huecos en la secuencia de rangos; -
NTILE(n)
: Divide las filas en una partición ordenada enn
grupos y asigna un número de grupo a cada fila.
Ejemplo
Clasificaremos las ventas según el Amount
para cada ProductID
en orden ascendente utilizando la función DENSE_RANK()
:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
La tabla de resultados contiene toda la información de la tabla principal y una columna adicional que proporciona el rango de cada venta para el producto en particular.
Funciones de comparación de valores
Las funciones de comparación de valores en ventanas en SQL se utilizan para comparar valores en la fila actual con valores en otras filas dentro de la misma partición.
Estas funciones son especialmente útiles para tareas que implican analizar tendencias, realizar cálculos basados en filas adyacentes o acceder a valores específicos de filas dentro de una ventana definida.
Existen varias funciones de comparación de valores en SQL:
LAG()
: Recupera el valor de una fila anterior en el conjunto de resultados sin necesidad de un self-join;LEAD()
: Recupera el valor de una fila posterior en el conjunto de resultados sin necesidad de un self-join;FIRST_VALUE()
: Devuelve el valor de la primera fila en el marco de la ventana;LAST_VALUE()
: Devuelve el valor de la última fila en el marco de la ventana.
Ejemplo
Utilicemos la función de comparación de valores de ventana LAG()
para calcular el cambio en el monto de ventas respecto a la venta anterior para cada producto:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Como resultado, podemos extraer fácilmente información sobre las diferencias de ventas para cada producto en particular sin utilizar subconsultas ni procedimientos almacenados.
También podemos calcular las diferencias para todas las ventas sin particionar utilizando la siguiente consulta:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Puedes observar que no incluimos la cláusula PARTITION BY
en el bloque OVER
. Esto significa que no queremos obtener los valores anteriores solo para un producto en particular, sino para todas las ventas en la tabla.
¡Gracias por tus comentarios!