Hola, hemos encontrado la respuesta a lo que buscas, desplázate y la hallarás aquí.
Solución:
No sólo los resultados, sino también la forma de obtener esos resultados para ambas medidas no será la misma.
Creé dos medidas similares a su ejemplo para probar esto:
TestAvgNoFilter = CALCULATE([PrcAvg]; cal[ReadDate]=DATE(2018;05;23))
TestAvgFilter = CALCULATE([PrcAvg]; filter(cal; cal[ReadDate]=DATE(2018;05;23)))
Cuando simplemente los arrojo a ambos en la tabla dinámica sin ningún campo o segmentación adicional, por supuesto, ambos muestran el mismo resultado:
Sin embargo:
-
Utilizando
FILTER
tiene un impacto significativo en el rendimiento, que se puede ver claramente al observar los planes de consulta y la utilización de Storage Engine frente a Formula Engine. Crea una tabla temporal adicional que necesita para “interactuar” con los filtros ya existentes provenientes del informe/tabla dinámica (filas, columnas, segmentaciones). No notará nada para el valor promedio simple en una sola celda, pero si su [x] medir en sí es complicado y hay muchos de esos filtros “iniciales”, la diferencia en el tiempo de cálculo puede ser enorme. -
FILTER
retiene e interactúa con el contexto de filtro inicial, mientras que la expresión de filtro se usa directamente enCALCULATE
lo ignora Vea lo que sucede cuando agrego ReadDate a la tabla dinámica:
Precisamente por eso la medida sin FILTER
es más rápido: no le importa qué fechas hay en las columnas, ya calculó una “true” valor, mientras que la medida con FILTER
se evalúa a sí mismo contra los filtros iniciales para cada fila.
Los resultados en ambas columnas pueden considerarse correctos; en realidad, todo depende de la interpretación y de cómo nombre las medidas;).
Como regla general, le sugiero que no use FILTER
cuando no tienes que hacerlo. Guarde su energía para cuando realmente la necesite.
La diferencia aquí es que CALCULATE
permite filtros simples que reemplazarán el contexto de filtro existente. En tu ejemplo, CALCULATE
calculará la medida [X]
usando el contexto de filtro existente, excepto que elimina cualquier contexto de filtro existente para FactTable[Color]
y lo reemplaza con FactTable[Color] = Red.
El FILTER
La función es un iterador, lo que significa que recorre la tabla (pasada como su primer argumento) una fila a la vez y evalúa la expresión (segundo argumento) para cada fila. Cuando usted tiene una FILTER
función dentro de CALCULATE
, combinará el contexto de filtro existente con los resultados del FILTER
(en lugar de reemplazarlo como un simple argumento de filtro).
En general, desea usar filtros simples siempre que tenga una opción, ya que el cálculo será más eficiente. sin embargo, el FILTER
La función le permite realizar un filtrado mucho más complejo, por lo que sigue siendo muy útil en los casos en que los filtros simples no son suficientes.
Lectura adicional: FILTER() – Cuándo, por qué y cómo usarlo
La sintaxis de DAX de la función de FILTRO automática generada por DAX en lugar de una expresión lógica requiere que exprese una sola columna en la expresión de filtro. Tomemos este ejemplo –
Measure1 = CALCULATE([X], 'FactTable'[Color]="Red")
La sintaxis anterior se transforma internamente en la siguiente, que puede escribir de manera explícita obteniendo el mismo comportamiento de su medida DAX.
Measure1 = CALCULATE([X], FILTER(ALL('FactTable'[Color]), 'FactTable'[Color]="Red"))
Entonces, si usa la última función en el valor de Medida2, obtendrá el mismo resultado.
Para mayor referencia puede visitar este enlace.
Comentarios y puntuaciones del artículo
Si te apasiona la programación, tienes el poder dejar un ensayo acerca de qué te ha impresionado de este ensayo.