Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

En este tutorial, vamos a echar un vistazo a un fragmento de código DAX. Es posible que ya hayas usado algo como esto. O bien, puede encontrarlo y sentirse confundido acerca de cómo funciona este código y cómo parece que tanto el contexto de fila como el contexto de filtro interactúan entre sí en un solo código DAX. De cualquier manera, este tutorial analizará todo lo anterior en detalle. Puedes ver el video completo de este tutorial en la parte inferior de este blog.

Primero, vamos a ver el código en sí. Luego repasamos la parte teórica para entenderlo mejor. Por último, veremos todo lo que ocurre detrás de escena usando DAX Studio .

El modelo de datos que vamos a utilizar es básicamente un modelo de datos de ventas simple que contiene Fechas, Ventas y la tabla Productos. La tabla Ventas contiene transacciones para cada día determinado. La tabla Productos contiene información sobre la información de ventas de los productos en cada día determinado. La tabla Fechas contiene solo unas pocas columnas para los fines de este tutorial.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Solo estamos interesados ​​en la tabla Fechas, pero vamos a usar la tabla Ventas y la tabla Productos para explicar cómo se propagan el contexto de filtro y el contexto de fila con la ayuda de las relaciones.

Tabla de contenido

Contexto de fila y contexto de filtro en una medida de total acumulado

Ahora, vamos a crear una medida de total acumulado porque contiene contextos de fila y filtro. Esta es una medida básica de total acumulado, donde uso COUNTROWS sobre el FILTRO y la función TODO para devolver todos los años que tengo dentro de la tabla Fecha. Cuando traigo esa medida dentro de la tabla a continuación, pueden ver que obtenemos el resultado que esperábamos.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Ahora intentemos analizar cómo funciona ese código DAX.

En la medida, puede ver que primero tenemos COUNTROWS, pero esa no es la primera función que se evalúa o ejecuta. Luego, tenemos la función FILTRO, y luego TODOS. Lo primero en el orden de evaluación es de TODOS. ALL devuelve todos los valores únicos del Número de año calendario de fechas ignorando cualquier contexto de filtro que exista fuera de la función ALL.

Entonces, en las métricas, tenemos la columna Número del año calendario y está filtrando activamente esa columna. Pero dado que ALL ignorará el contexto de filtro existente, obtendremos todos los valores únicos de esa columna.

En el segundo argumento, en el contexto de la fila, hemos escrito que el Número de año calendario de fechas debe ser menor que el Número de año calendario de fechas MAX. Ahora, si es un principiante y todavía está tratando de comprender y aprender DAX, podría pensar que tanto las referencias en el lado izquierdo como dentro de la función MAX pertenecen a la misma columna y son la misma tabla que tenemos dentro TODAS las funciones.

Pero eso no es verdad. La única parte del contexto de fila que pertenece a la función ALL es la que tenemos en el lado izquierdo. El que tenemos en MAX se evalúa dentro de un contexto de filtro y no en el contexto de fila.

Entonces, FILTER intenta crear un contexto de fila en la tabla que proporciona en el primer argumento, y esta parte del código en realidad se recupera de ese contexto de fila en particular. Entonces, cada fila, FILTER itera esa tabla que tenemos dentro de ALL, y luego podemos acceder a todos los valores que estamos iterando actualmente.

Entonces, en la primera iteración, solo tenemos un valor. En la segunda iteración, tenemos el segundo valor. Pero cuando escribimos MAX, es independiente del contexto de fila que estamos creando usando la función FILTRO. Entonces, MAX se evalúa en el contexto del filtro que está creando el Número del año actual que hemos usado en esa matriz.

Cuando estamos en 2006, MAX devolverá 2006, mientras que la fila actual puede ser 2006, 2007 o 2008. FILTER devolverá la tabla que satisfaga los criterios que estamos especificando en el segundo argumento. Cuando nos movemos a 2007, MAX devolverá 2007. En 2008, devolverá 2008. Y dependiendo de todos los valores que son menores que el valor que devuelve la función MAX, FILTER devolverá un mesa.

Para demostrar que MAX no depende del contexto de la fila, podemos segregar esta pieza de código DAX en varias variables. Y entonces, podremos entender que la referencia de la columna en el lado izquierdo y en el lado derecho no es la misma.

Entonces, vamos a crear una variable.

Como puede ver en la medida a continuación, creé tres variables ( ). Luego agregué el código FILTER por último con una variable Result que usa COUNTROWS . Cuando uso esta medida en la tabla a continuación, verá que nada cambia. Los resultados siguen siendo los mismos. Todavía obtenemos el mismo total acumulado que obtuvimos antes.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Si volvemos al código e intentamos recuperar el valor de la primera variable y lo confirmamos, puede ver que para cada fila, obtenemos el mismo año.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Entonces, con suerte, pude explicarles que la función MAX, en este código en particular, en realidad no depende del contexto real para sus valores. Y si desea simplificar su comprensión del contexto de evaluación, siempre puede dividir el código en varias variables para que pueda comprender el orden de evaluación y cómo se ejecuta el código.

Ahora, quiero mostrarle un escenario en el que la función MAX dependerá del contexto de fila creado por la función FILTRO.

Entonces, volvamos a esa medida. Dupliquemos eso, y en lugar del último año visible, tendré MAX Dates Calendar Year Number. Cuando traigo eso a la matriz, pueden ver que tenemos un espacio en blanco.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

¿Por qué?

La cosa es que estamos iterando todos los años y lo que hace CALCULATE es que convierte la fila actualmente iterada en un contexto de filtro equivalente.

Si escribo un signo igual aquí, puedes ver que obtenemos siete, siete y siete.

¿Por qué?

Permítanme crear una nueva tabla calculada para que puedan entender fácilmente lo que está sucediendo.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Iré a crear una nueva tabla. A continuación, voy a escribir sobre TODAS las fechas Número del año calendario. Luego, escribiré Año máximo y luego usaré CALCULAR sobre el MÁXIMO del Número de año calendario de fechas. Y ahora puedes ver que para cada fila, estamos repitiendo el mismo valor.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Dado que estos números no son estrictamente menores que ellos mismos, tenemos un espacio en blanco. Pero cuando usamos igual a (=), estamos diciendo que todos los valores que son menores que 2011 obtienen un siete.

Además, incluso si está utilizando una referencia de medida como Max Year, este código no funcionará.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Si hago clic en confirmar, puede ver que todavía no obtenemos nada. Esto se debe a que cuando escribimos Max Year, simplemente estamos escribiendo CALCULATE MAX Dates Calendar Year Number.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Una referencia de medida siempre tiene un CALCULATE fuera de ella. Entonces, esta medida está iniciando una transición de contexto que convierte la fila iterada actualmente en un contexto de filtro.

Pero si está atado y tiene que usar una referencia de medida, lo que puede hacer es almacenar esa medida en una variable. Y como sabrá, las variables son constantes y no pueden crear una transición de contexto. Por lo tanto, no puede convertir el contexto de fila en un contexto de filtro.

Entonces, esa es una demostración rápida de cómo un contexto de fila y un contexto de filtro interactúan entre sí en un código DAX.

Ahora vayamos a DAX Studio para comprender lo que sucede detrás de escena.

Uso de DAX Studio para comprender el contexto de la fila y el contexto del filtro

Vayamos a Herramientas externas e iniciemos DAX Studio. Necesitamos conectarnos al archivo de LuckyTemplates con la ayuda de Query Plan y Server Timings .

Luego, voy a crear una medida de consulta. Escribiré DEFINIR MEDIDA en la tabla Fechas, Total acumulado de fechas. Y luego, usaré el código original que teníamos.

Como se supone que debemos devolver una tabla, podemos escribir EVALUAR. Finalmente, vamos a crear la tabla usando SUMMARIZECOLUMNS. Entonces, vamos a escribir las fechas, el número del año calendario y la columna virtual, que será el total acumulado. Y luego, puedo escribir algo como DT como una palabra clave de DAX Studio.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Si ejecuto este código, puede ver que el código está completo y aún obtenemos el mismo resultado que hemos visto dentro de LuckyTemplates.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Ahora, vayamos al Plan de consulta para comprender lo que sucede detrás de escena. Veamos si la función MAX realmente depende del contexto de la fila o no. Vayamos al Plan de consulta lógico porque el Plan de consulta físico generalmente es más complejo y es un poco difícil de leer.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Puede ver que el primer operador en la primera línea es GroupSemiJoin y que SUMMARIZECOLUMNS lo usa para crear una unión interna entre dos columnas.

Luego, para unir esas columnas, está Scan_Vertipaq , que es el motor de almacenamiento que tenemos dentro de los servicios de análisis. Podemos ver que dice que necesitamos una columna, que es Fechas Calendario Año Número. En LuckyTemplates, puede ver que en la matriz tenemos esta columna Número de año calendario, que actúa como acceso a nuestro informe.

A continuación, tenemos la función COUNTROWS en nuestra medida como operador de nivel superior, luego COUNTROWS llama a la función FILTER para el filtro. Hay un Scan_Vertipaq nuevamente, que dice que RequiredCols es Dates Calendar Year Number.

Las líneas 2 y 5 son iguales, pero el primer Scan_Vertipaq está marcado con cero mientras que el segundo está marcado con uno. Eso significa que la columna a la que estamos accediendo, con la ayuda de la función ALL, se extrae por separado de la columna que tenemos dentro de la función SUMMARIZECOLUMNS.

Entonces, hay un operador LessThan . En la siguiente línea, podemos ver que hay una comparación entre el contexto de la fila y la función MAX .

A esto le sigue el Max_Vertipaq . Entonces, en realidad estamos extrayendo el valor máximo del motor de almacenamiento. Hacia la derecha, puede ver que dice DependOnCols Dates Calendar Year Number. Esto es lo más importante que debemos recordar. Anteriormente dije que no hay dependencia de la función MAX en el contexto de la fila, y esto es lo que realmente lo prueba.

Entonces, aquí dice cero.

¿Dónde encontramos el cero?

En la parte superior (la segunda línea), que se extrae para SUMMARIZECOLUMNS. Eso significa que la función MAX no depende del contexto de la fila, sino que en realidad depende de la columna (Número de año calendario) que tenemos dentro de esa tabla. Entonces esa tabla en realidad está creando el contexto del filtro.

En resumen, la función MAX depende del contexto del filtro y no del contexto de la fila.

A continuación, puede ver que para calcular el Max_Vertipaq, tenemos un Scan_Vertipaq , que dice que DependOnCols es cero (0) Fecha Calendario Año Número. Y luego, hay varias otras columnas que requieren columnas.

Ahora veamos la versión variable del código. En lugar de devolver LastVisibleYear, voy a devolver la versión COUNTROWS o la variable Result, y puede ver que todavía obtenemos el mismo resultado.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Si miramos el Query Plan, se puede ver que es un poco más largo, pero es mucho más fácil de leer.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Por último, aquí también está la versión calculada del código.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates

Y así es como luce su Plan Lógico de Consulta.

Contexto de fila y contexto de filtro en un código DAX de LuckyTemplates


DAX LuckyTemplates: ¿Qué es el contexto de fila
Introducción al contexto de filtro en LuckyTemplates
¿Qué es la transición de contexto y por qué es importante?

Conclusión

En este tutorial, expliqué cómo una función dada puede interactuar y no puede interactuar con el contexto de la fila. También le mostré cómo el MAX, en este caso, se evaluó en el contexto del filtro y no en el contexto de la fila.

Es importante recordar siempre que el contexto de filtro filtra todo el modelo y el contexto de fila solo itera la tabla dada y nunca filtra el modelo. El contexto del filtro no itera una tabla.

Espero que hayas encontrado útil este tutorial. Estén atentos a nuestro código DAX Studio que lanzaremos muy pronto. Profundizaremos mucho más en escenarios similares. También le enseñaremos cómo puede optimizar su código DAX.


Qué es uno mismo en Python: ejemplos del mundo real

Qué es uno mismo en Python: ejemplos del mundo real

Qué es uno mismo en Python: ejemplos del mundo real

Cómo guardar y cargar un archivo RDS en R

Cómo guardar y cargar un archivo RDS en R

Aprenderá a guardar y cargar objetos desde un archivo .rds en R. Este blog también cubrirá cómo importar objetos desde R a LuckyTemplates.

Revisión de los primeros N días hábiles: una solución de lenguaje de codificación DAX

Revisión de los primeros N días hábiles: una solución de lenguaje de codificación DAX

En este tutorial del lenguaje de codificación DAX, aprenda a usar la función GENERAR y a cambiar dinámicamente el título de una medida.

Showcase Insights utilizando la técnica de elementos visuales dinámicos de subprocesos múltiples en LuckyTemplates

Showcase Insights utilizando la técnica de elementos visuales dinámicos de subprocesos múltiples en LuckyTemplates

Este tutorial cubrirá cómo usar la técnica de elementos visuales dinámicos de subprocesos múltiples para crear información a partir de visualizaciones de datos dinámicos en sus informes.

Introducción al contexto de filtro en LuckyTemplates

Introducción al contexto de filtro en LuckyTemplates

En este artículo, repasaré el contexto del filtro. El contexto del filtro es uno de los temas principales que cualquier usuario de LuckyTemplates debería conocer inicialmente.

Los mejores consejos para usar las aplicaciones en el servicio en línea de LuckyTemplates

Los mejores consejos para usar las aplicaciones en el servicio en línea de LuckyTemplates

Quiero mostrar cómo el servicio en línea de LuckyTemplates Apps puede ayudar a administrar diferentes informes e información generada a partir de varias fuentes.

Analice los cambios en el margen de beneficio a lo largo del tiempo: análisis con LuckyTemplates y DAX

Analice los cambios en el margen de beneficio a lo largo del tiempo: análisis con LuckyTemplates y DAX

Aprenda a calcular los cambios de su margen de beneficio utilizando técnicas como la bifurcación de medidas y la combinación de fórmulas DAX en LuckyTemplates.

Ideas de materialización para cachés de datos en DAX Studio

Ideas de materialización para cachés de datos en DAX Studio

Este tutorial analizará las ideas de materialización de cachés de datos y cómo afectan el rendimiento de DAX al proporcionar resultados.

Informes comerciales con LuckyTemplates

Informes comerciales con LuckyTemplates

Si todavía usa Excel hasta ahora, este es el mejor momento para comenzar a usar LuckyTemplates para sus necesidades de informes comerciales.

¿Qué es la puerta de enlace de LuckyTemplates? Todo lo que necesitas saber

¿Qué es la puerta de enlace de LuckyTemplates? Todo lo que necesitas saber

¿Qué es la puerta de enlace de LuckyTemplates? Todo lo que necesitas saber