Tipos de Funciones de Ventana
Desliza para mostrar el menú
Exploración breve de los principales tipos de funciones de ventana utilizadas en SQL.
Funciones de agregación
Funciones de agregación estándar (AVG, SUM, MAX, MIN, COUNT) utilizadas en un contexto de ventana. Este tipo de función de ventana ya se utilizó en el capítulo anterior.
Funciones de ordenación
Funciones de ordenación en SQL como tipo de función de ventana que permiten asignar un rango a cada fila dentro de una partición de un conjunto de resultados. Estas funciones son ú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 de una partición ordenada enngrupos y asigna un número de grupo a cada fila.
Ejemplo
Clasificación de 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 correspondiente.
Funciones de comparación de valores
Funciones de ventana para comparación de valores en SQL utilizadas para comparar valores de la fila actual con valores de otras filas dentro de la misma partición.
Estas funciones son especialmente útiles para 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
Uso de la función de ventana de comparación de valores 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;
Partes principales de la consulta:
- Cláusula
SELECT: Especifica las columnas que se recuperarán de la tabla.- Nombres de columnas: Incluye columnas como
SalesID,ProductID,SalesDateyAmountpara mostrar los datos relevantes de cada venta. - Función de ventana: Utiliza la función
LAG()para recuperar el valor de la fila anterior para una columna específica dentro de una partición. Una columna calculada adicional muestra la diferencia entre los valores actual y anterior.
- Nombres de columnas: Incluye columnas como
Sintaxis de la función de ventana:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Columna de la que se recupera el valor anterior.offset: Número de filas hacia atrás desde la fila actual para recuperar el valor (por defecto es 1).default_value: Valor que se devuelve si el desplazamiento excede los límites de la partición (opcional).PARTITION BY partition_column: Divide el conjunto de resultados en particiones a las que se aplica la función de ventana, asegurando que la función opere de forma independiente en cada partición.ORDER BY order_column: Especifica el orden de las filas dentro de cada partición, asegurando que la función de ventana procese las filas en una secuencia significativa.
Como resultado, se puede extraer fácilmente información sobre las diferencias de ventas para cada producto en particular sin utilizar subconsultas ni procedimientos almacenados.
También es posible calcular 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