El post que se desarrolla a continuación, es el primero de dos publicaciones que pretende realzar el potencial de las funciones de ventana (Windows Functions), ya que representan una herramienta poderosa en escenarios en los que queremos aplicar cálculos agregados a un subconjunto de filas y que devuelven dicho cálculo para cada fila incluida en la agrupación.
En este primer post, se presenta la estructura general y funcionalidades principales para rematar con un segundo post en el que se desarrollará casos de uso reales en las que podemos aplicarlas.
Antes de empezar, veamos conceptualmente la diferencia entre las funciones agregadas con uso de GROUP BY, frente al uso de funciones de ventana.
En el caso de cálculos agregados con uso de cláusula GROUP BY, se obtiene como resultado una fila por cada valor diferente del atributo usado en el GROUP BY. La siguiente ilustración, muestra cómo funciona una consulta con funciones agregadas haciendo uso de la cláusula GROUP BY.
Sin embargo, con el uso de las windows functions, la cosa cambia. En la siguiente ilustración, se muestra la diferencia del uso con estas funciones. En este caso, se devuelven todas las filas con el resultado de aplicar el cálculo de agrupación.
Incluso podemos hacer uso de funciones de ventanas sin definir un grupo (partición) de datos, mostrando el cálculo aplicado sobre todas las filas de la tupla.
Nota: Se muestra un subconjunto de filas del resultado de ejecutar la query anterior.
En algunos escenarios, podemos plantear la misma consulta con GROUP BY y Windows Functions. En el siguiente ejemplo, se analizan dos consultas para obtener el mismo resultado con versiones GROUP BY y Windows Functions. En dicho análisis, se puede comprobar que la versión con Windows Functions es más eficiente que la versión con GROUP BY.
Acelera tus procesos de Business Analytics. Toma mejores decisiones, optimiza tu Datawarehouse y el proceso de generación de informes en tus proyectos de analítica con nuestra consultoría en Business Intelligence.
Voy a echar un vistazoComo hemos visto en los ejemplos anteriores, la cláusula Partition, permite restringir las filas sobre las que se aplica el resultado de la función agregada mostrando los mismos valores en las columnas de partición de ventana.
Nota: Se muestra un subconjunto de datos representativos del total devuelto por la consulta
En el ejemplo anterior, se muestran dos cálculos agregados:
Los Frames permiten definir, de forma más granular, las filas sobre la que aplicamos funciones agregadas, dentro de una partición o grupo de datos.
Para la definición de Frames, es necesario el uso de la cláusula ORDER BY para ordenar las filas de cada partición permitiendo confinar un marco de filas entre dos delimitadores.
Con la consulta anterior, obtenemos la suma del campo qty con el acumulado de la fila anterior, aplicado sobre los grupos de filas con el mismo valor del campo empid, ordenados por el campo ordermonth.
Analicemos el resultado obtenido para la partición con valor de empid=1, que es aplicable al resto de particiones.
Analicemos el comportamiento de uno y otro caso con la consulta que se muestra a continuación:
En las siguientes ilustraciones se muestra el comportamiento de la consulta anterior con ROWs y RANGE.
Uso de Cláusula ROWS:
Uso de Cláusula Range:
En las siguientes ilustraciones, se muestran las opciones que se disponen para definir Frames.
Funciones que permiten extraer valores de otras filas: LAG, LEAD: Permiten extraer valores de filas anteriores (LAG) o siguientes (LEAD).
Puede indicarse desplazamiento explícito y valor predeterminado si la fila no existe, por ejemplo, LAG(cantidad, 3, 0)
Nota: Se muestran solo las primeras 20 filas de la tupla.
First_value. Devuelve el primer valor de un conjunto ordenado de valores.
Last_value. Devuelve el último valor de un conjunto ordenado de valores.
Nota: Para ver el resultado de aplicar las funciones FIRST_VALUE y LAST_VALUE de forma más clara, se ordena la consulta por los valores afectados (custid, orderdate y orderid).
En el post presentado, se plantean las funciones de ventanas como herramienta para la obtención de datos agregados junto al conjunto de datos que conforman la tupla sobre las que se aplican. Entre los aspectos analizados están:
En este primer post, se presenta el paradigma de las funciones de ventana para plantear en publicaciones posteriores, casos de uso reales en los que podemos aplicar los conceptos que aquí se desarrollan.
Recuerda, si tienes dudas o algún problema en concreto que te impide avanzar en la optimización de tus bases de datos y tu proyecto de SQL, no dudes en contactar con nosotros. No esperes más para acelerar tus procesos de Business Analytics y tomar mejores decisiones.
Voy a Echar un vistazoSoy Ingeniero Técnico en Informática y Máster en diseño y gestión de proyectos, con más de 20 años de experiencia en informática, desempeñando diversas funciones en el sector. Actualmente soy Arquitecto de Plataformas de Datos en Verne Technology Group realizando análisis, implementación, puesta a punto, etc. de proyectos en plataformas con SQL Server.