Debajo del capó: cómo funciona Dax con los filtros

Comencemos con una mesa simple:

Figura 1: la tabla simple para comenzar (figura del autor)

Cada fila en Matrix Visual muestra las ventas totales en línea para cada mes.
Hasta ahora, todo bien.

La interpretación es que vemos el total de ventas en línea filtradas por mes.

Pero esta no es toda la verdad.

Echemos un vistazo al modelo de datos:

Figura 2: la parte del modelo de datos con la tabla de fechas y la tabla de hechos (figura del autor)

Cuando mira con cuidado, ves que la relación se construye entre las dos columnas de fecha.

No hay relación con la columna del mes.

Cuando tomamos esta ruta, la interpretación anterior no es del todo precisa.

La interpretación completa debe ser: cada fila muestra el total de ventas en línea filtradas por la tabla de fechas. Las filas de la tabla de fechas están agrupadas por los meses. Cada fila muestra las ventas totales para todos los días para cada mes.

Estamos un paso más cerca de comprender DAX en general, y las funciones de inteligencia de tiempo en particular, cuando nos damos cuenta de este detalle.

Vamos un paso más allá.

Ytd y la consulta básica

Ahora, agregemos una medida de YTD para examinar lo que sucede:

Figura 3: la medida de YTD y los resultados están en la misma tabla que antes (figura del autor)

La medida no es nada especial, y los resultados son fáciles de entender.

Ahora, echemos un vistazo a lo que hace precisamente la función DatesyTD ().

La explicación de Dax. Guide dice: “Devuelve un conjunto de fechas en el año hasta la última fecha visible en el contexto del filtro”.

¿Qué significa esto exactamente?

Para sumergir en esta pregunta, escribamos primero una consulta DAX, para obtener la lista de fechas en junio de 2024, como se hace en la visualización anterior:

Definir var anualfilter = tratas ({2024}, ‘fecha'[Year]) Var mesFilter = tratas ({6}, ‘fecha'[Month]) Evaluar resumarizeColumns (‘fecha'[Date]
Año Filter, MonthFilter)

El resultado es una lista de 30 días para junio:

Figura 4 – Consulta de base para obtener todos los días para junio de 2024 (cifra del autor)

Este es el filtro aplicado a la fila para junio de 2024 en la matriz que se muestra arriba.

¿Cuál es el resultado cuando aplicamos la función DatesyTD () al resultado?

Aquí está la consulta:

Definir var anualfilter = tratas ({2024}, ‘fecha'[Year]) Var mesFilter = tratas ({6}, ‘fecha'[Month]) Var BaseDates = CalculateTable (SummarizeColumns (‘Fecha'[Date]
YearFilter, MonthFilter)) var ytddates = Datesytd (tratados (bases datas, ‘fecha'[Date])) Evalúe Ytddates

Y aquí, el resultado:

Figura 5 – Lista de fechas que comienzan el primero de enero hasta el último día de junio de 2024 (figura del autor)

Es una lista de 182 filas, que contiene todas las fechas a partir del comienzo del año hasta el último día de junio de 2024.

Esta es la definición de YTD.

Cuando miramos la siguiente medida:

Ventas en línea (YTD) = var ytddates = Datesytd (‘fecha'[Date]) Return calcule ([Sum Online Sales]
Ytddates)

Nos damos cuenta de que la variable YTDDATES es “solo” una lista de fechas aplicadas como un filtro a la función calculación ().

Esta es la clave para las funciones de inteligencia de todos los tiempos.

Regrese un año, algunos ejemplos

¿Qué sucede al aplicar otra función al resultado?

Por ejemplo, Sameperiodlastyear ()?

Para responder a esta pregunta, uso la siguiente consulta DAX:

Definir var anualfilter = tratas ({2024}, ‘fecha'[Year]) Var mesFilter = tratas ({6}, ‘fecha'[Month]) Var BaseDates = CalculateTable (SummarizeColumns (‘Fecha'[Date]
YearFilter, MonthFilter)) var ytddates = Datesytd (tratados (bases datas, ‘fecha'[Date])) Var ytddatespy = samePeriodlastyear (ytddates) evalúa YtdDatespy

Intencionalmente separé el llamado de SamePeriodlastyear () de Datesytd () para que sea más fácil de leer. Hubiera sido posible anidar Datesytd () en Sameperiodlastyear ().

Esta vez, tenemos 181 filas, ya que 2024 fue un año bisiesto.
Y las fechas se vuelven de regreso por un año:

Figura 6: el resultado de la consulta después de aplicar sameperiodlastyear () (figura del autor)

Entonces, nuevamente, cuando aplicamos una función de inteligencia de tiempo a una medida, la función, por ejemplo, DatesyTD (), devuelve una lista de fechas.
Tenga en cuenta: al aplicar el filtro, se eliminan los filtros existentes en la tabla de fechas.

Lógica personalizada

Ahora, usemos este conocimiento sobre la lógica de inteligencia de tiempo personalizado.

Primero, cambiemos ligeramente el filtro para el año y el mes:

Definir var anualmonthfilter = tratas ({202406}, ‘date'[MonthKey]) Evaluar resumarizeColumns (‘fecha'[Date]
YearmonthFilter)

El resultado de esta consulta es el mismo que al comienzo de este artículo.

Esta vez, configuré el filtro con un valor numérico en el [MonthKey] columna.

¿Cómo puedo volver al año anterior?

Si crees matemáticamente, es solo restando 100:

202406 – 100 = 202306

Vamos a intentarlo:

Figura 7: el resultado de la consulta después de deducir 100 del [MonthKey] columna (figura del autor)

También puede hacer esto con otros formatos numéricos.

Cuando tomas un año fiscal, por ejemplo, así: 2425 (para el año fiscal 24/25)

Puede deducir 101 para obtener el año fiscal anterior: 2425 – 101 = 2324

Otro ejemplo de una lógica de inteligencia de tiempo personalizada es un promedio de ejecución, donde para cada día, calculamos el valor promedio en los últimos 10 días:

Figura 8: el código y los resultados de la medida para un promedio móvil durante los diez días anteriores (cifra del autor)

Como el contenido de la variable Daterange es nuevamente una lista de fechas, puedo aplicar la función sameperiodlastyear () y obtener el resultado que necesito:

Definir var anualfilter = tratas ({2024}, ‘fecha'[Year]) Var mesFilter = tratas ({6}, ‘fecha'[Month]) // 1. Obtenga la primera y última fecha para el contexto del filtro actual var maxdate = calcule (max (‘fecha'[Date] ), YearFilter, MonthFilter) var mindate = calcule (dateadd (‘fecha'[Date]- 10, día), ‘Fecha'[Date] = MaxDate) // 2. Genere el rango de fecha necesario para el promedio móvil (cuatro meses) var daterange = calculeTetable (fechatebet (‘fecha'[Date]
Mindate, maxDate)) Evalúe samperiodlastyear (daterange)

Y este es el resultado:

Figura 9: el resultado para el promedio móvil para el año anterior (cifra del autor)

Esta lógica devuelve 11 filas, ya que incluye el último día del mes. Dependiendo del resultado requerido, debemos ajustar la forma en que calculamos las fechas de primera y última de la lista de fechas (el filtro aplicado a la medida).

Por supuesto, esta es una repetición de lo que mostré anteriormente. Sin embargo, demuestra que el mismo enfoque se puede aplicar a varios escenarios.

Tan pronto como comprenda esto, su trabajo con funciones de inteligencia del tiempo y otras funciones que aceptan tablas de valores como entrada serán mucho más fácil de comprender y dominar.

Conclusión

Si bien utilicé Dax Studio para las consultas, puede usar las mismas consultas en la herramienta DAX Consulty dentro de Power BI Desktop.

Utilicé intencionalmente estas consultas para demostrar que trabajamos con tablas todo el tiempo en DAX, aunque no siempre seamos conscientes de ello.

Pero es un detalle importante que nos ayuda en nuestro camino a comprender DAX.

Aunque parte del código DAX que se muestra aquí puede estar obsoleto con el advenimiento de la nueva función de inteligencia de tiempo basada en calendario en Power BI, los principios explicados aquí siguen siendo válidos. Las funciones, como DatesyTD () o SamePerioDlastyear (), todavía existen y funcionan de la misma manera que antes. Por el momento, nada cambiará de este lado, ya que los conceptos descritos aquí siguen siendo válidos.

Referencias

Como en mis artículos anteriores, uso el conjunto de datos de muestra Contoso. Puede descargar el conjunto de datos ContaSoretailDW de forma gratuita de Microsoft aquí.

Los datos de Contoso se pueden usar libremente bajo la licencia MIT, como se describe en este documento. Cambié el conjunto de datos para cambiar los datos a fechas contemporáneas.