Seguimos con los cálculos visuales y en este post vamos hablar de las funciones relativas a las diferentes posiciones de los datos en nuestro cálculo visual, y estas funciones son:
PREVIOUS, FIRST, NEXT y LAST
¿Qué hacen estas funciones? Bien, cada una de ellas tiene su cometido y es:
PREVIOUS
Recupera un valor en el elemento anterior de un eje de la matriz visual.
FIRST
Recupera un valor en la matriz visual del primer elemento de un eje.
NEXT
Recupera un valor en el siguiente elemento de un eje de la matriz visual.
LAST
Recupera un valor de la matriz visual del último elemento de un eje.
Lo primero de todo, indicar que estas funciones sólo son aplicables a cálculos visuales.
Ahora como siempre, una vez visto la sintaxis de cada una de las funciones, vamos a Power BI Desktop para analizar una a una cada función.
Tenemos el siguiente modelo en estrella de Contoso:
Con la siguiente matriz con las ventas totales por año en el lienzo:
Si ahora hacemos clic sobre el icono de “Nuevo cálculo visual”, y invocamos a la función “PREVIOUS” y le pasamos como argumento la columna Ventas Totales:
Observamos que nos está devolviendo para el año 2008 el valor de las ventas del año 2007, y para el año 2009 nos está devolviendo las ventas del valor 2008:
Es decir, nos está devolviendo el valor de la fila anterior. En este punto, es cuando nos preguntamos que esto mismo lo podemos hacer con la función DATEADD, sí, pero la función DATEADD es una función de inteligencia temporal, mientras que la función PREVIOUS, nos va a funcionar independientemente del contexto de filtro de la matriz. ¿Qué quiero decir? Supongamos que en vez del atributo del año, tenemos la categoría del producto:
La métrica de las ventas totales nos calcula el total por categoría, pero con el cálculo visual, ahora nos está trayendo a la siguiente categoría, el valor de la fila anterior, independientemente del tiempo. ¿Se entiende? Bien, ahora vamos con el segundo argumento de la función que son los pasos (steps). ¿Qué significan los pasos? El número de posiciones que quiero desplazarme para colocar el cálculo. Por ejemplo, por defecto, la métrica es así, o lo que es lo mismo, con el paso implícitamente en 1:
Y esta nos devuelve lo que hemos visto (hemos cambiado el atributo de categoría a “AñoMes”)
Si ahora el segundo argumento, en vez de 1 lo colocamos en 3 por ejemplo:
Lo que nos devuelve es lo siguiente:
El valor de las ventas desplazado 3 pasos, es decir, en el mes de abril del año 2007 nos devuelve el valor de enero del 2007. ¿Hasta aquí bien?
Continuamos con el tercer argumento, que es el eje (<axis>). ¿Qué tiene que ver el eje en una matriz? A lo que se refiere este argumento, es a si el calculo se realiza en base a la fila o la columna.
Por defecto, si no indicamos nada, el calculo se va a realizar en base a las filas:
Como podemos ver, el resultado permanece inalterable cosa la cual es normal debido a que si no se lo especificamos es el argumento por defecto.
Ahora introducimos una columna a la matriz, como por ejemplo la clase del producto:
Y vemos que el cálculo visual nos ha introducido un valor para cada uno de las clases. Bien, ahora vamos a modificar la métrica y en vez de ROWS en el argumento, vamos a indicarle COLUMNS y en vez de 3 anteriores que sean 2:
Y obtenemos:
El valor de 2 columnas anteriores, es decir, nos estamos moviendo entre columnas de la matriz. ¿Se entiende lo que realiza?
Continuamos no con el siguiente argumento, sino con el último argumento, el argumento restablecer (<reset>) que especifica cómo se reinicia el cálculo. Los valores válidos son: None, LowestParent, HighestParent o un entero. Ninguno es el valor predeterminado. Bien, volvemos a reestablecer la matriz sin la clase en la columna y el calculo visual lo dejamos en ROWS:
Ahora, sobre las filas, añadimos un nivel de jerarquía que es el año:
En el que vemos que nos devuelve el valor de las ventas del 2007 en el año 2009. Si desplegamos el nivel de jerarquía del año 2007:
Vemos que, en el mes de marzo del 2007, nos está devolviendo el valor de las ventas de enero del 2007. ¿Qué conclusión obtenemos entonces? Que la función DAX nos devuelve el valor anterior dependiendo del eje en el que me encuentre. Si añadimos otro nivel de jerarquía intermedio, como por ejemplo el trimestre:
Vemos que en el eje de trimestre, hasta el tercer trimestre no nos devuelve el valor del primer trimestre, cosa la cual es correcta debido al 2 de la métrica. Por el contrario, en el eje de mes, nos devuelve el valor en el mes de marzo el valor de enero. Y a nivel el año, hasta el 2009 no nos devuelve el valor del 2007:
Como podemos ver, el cálculo no se reinicia nunca, es decir, continua hasta el final de nuestra matriz. ¿Pero y si queremos que se reinicie por ejemplo cada trimestre? ¿O cada año por ejemplo? Para ello tenemos los parámetros del argumento restablecer. Por ejemplo, el LowestParent, que lo que va a realizar es cuando cambie el padre más próximo a él, es decir, el trimestre y el padre más alejado es el año. Veámoslo:
Vemos que cuando cambia el padre más cercano, en este caso el trimestre, el cálculo visual se reinicia. Si por el contrario, le indicamos que el valor del argumento es HighestParent:
En conclusión, la función PREVIOUS nos permite desplazarnos dinámicamente entre los valores de una matriz, independientemente del contexto de filtro. Su flexibilidad radica en la capacidad de ajustar el desplazamiento, operar en distintos ejes (filas o columnas) y controlar cómo se reinicia el cálculo según niveles jerárquicos.
Continuará...
¡Nos vemos en los datos!