cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
sjrrkb123
Helper III
Helper III

Pregunta conceptual - FILTER vs KEEPFILTERS vseither - ¿Cuál es la diferencia?

Como he estado trabajando con Power BI cada vez más, me he estado preguntando cuál es la diferencia en el siguiente cálculo:
1) "Ninguno"
Calculate(SUM('Table 1'[Profit]), 'Customer'[Name] á "Bob"))

2) FILTRO
Calculate(SUM('Table 1'[Profit]), FILTER('Customer', 'Customer'[Name] á "Bob"))

3) KEEPFILTERS
Calculate(SUM('Table 1'[Profit]), KEEPFILTERS('Customer'[Name] á "Bob"))

Hasta ahora lo que sí sé al leer la documentación es el FILTER y KEEPFILTERS difieren en qué motor utilizan. KEEPFILTER utiliza el motor de almacenamiento y no se puede utilizar para comparar columnas con columnas (o columnas con medidas). El argumento FILTER utiliza el motor de fórmulas y puede hacer todo lo que hace KEEPFILTERS y comparaciones mucho más avanzadas.

Lo que estoy confundido es a menudo, los tres resultan en la misma respuesta.

Así que mi pregunta es la siguiente: ¿Qué circunstancias permiten (1), (2) y (3) opciones para dar lugar a la misma respuesta y cuándo proporcionaría los resultados diferentes?

Gracias por cualquier ayuda proporcionada.

1 ACCEPTED SOLUTION
v-stephen-msft
Community Support
Community Support

Hola @sjrrkb123 ,

KEEPFILTERS es un modificador de filtro que no elimina los filtros de columna o tabla existentes en el contexto de filtro que entran en conflicto con los filtros aplicados por el parámetro KEEPFILTERS.

Probablemente todavía se siente muy abstracto. Antes de explicar el uso específico de esta función, echemos un vistazo a un caso: Calcular las ventas de productos cuyo color es rojo. La mayoría de las personas escribirán la siguiente medida:

AlwaysRed =
CALCULATE ( 
 [SalesAmount], 
 Products[Color]= "Red"
)

Dentro del motor, esta expresión se transformará en la siguiente expresión:

AlwaysRed_Filter =
CALCULATE (
 [SalesAmount],
 FILTER(
 ALL( Products[Color] ),
 Products[Color]= "Red"
 )
)

En otras palabras, la función ALL dentro de CALCULATE elimina el filtrado de la columna Color por el filtro externo, y todos los filtros externos se calculan según el nuevo color del filtro como rojo.

Si no desea perder los filtros externos existentes, un método ampliamente utilizado es reemplazar ALL por VALUES, el código es el siguiente:

OnlyRed_Values =
CALCULATE (
 [SalesAmount],
 FILTER(
 VALUES( Products[Color] ),
 Products[Color]= "Red"
 )
)

Echemos un vistazo a cómo diferirán los resultados de varias funciones, como se muestra en la siguiente figura:

v2-b2ffefc353deed044bfc30c084861260_720w.jpg

En la medida AlwaysRed, debido a la existencia de ALL, el filtro rojo reemplaza el filtro de color del filtro externo, por lo que el resultado será el número de ventas de productos en rojo; y Values se utiliza en OnlyRed_Values, que no cancela el filtro de contexto externo, el resultado en este momento es el resultado de la interacción entre el contexto externo y el contexto interno. Tomando BLACK como ejemplo, el contexto externo filtra el negro y los filtros internos rojos. La intersección entre los dos está vacía, por lo que el resultado es 0.

Para el efecto logrado por OnlyRed_Values, también podemos utilizar KEEPFILTERS para lograr, primero mirar el código:

OnlyRed =
CALCULATE (
 [SalesAmount],
 KEEPFILTERS( Products[Color] = "Red" )
)

En consecuencia, este código es equivalente al código siguiente:

OnlyRed_KeepfiltersAll =
CALCULATE (
 [SalesAmount],
 KEEPFILTERS(
 FILTER(
 ALL( Products[Color] ),
 Products[Color]= "Red"
 )
 )
)

Vamos a reinterpreter este código a través de la descripción gramatical anterior de la función. ALL cancela el filtrado de color del contexto externo. Cuando el contexto externo entra en conflicto con el color, el filtro interno se utiliza en su lugar, pero la apariencia de KEEPFILTERS conserva el filtro externo. Filtre el color para que se calcule el mismo resultado que el valor de medida OnlyRed_Values.

Bien, para hacer un resumen simple:

CALCULATE([SalesAmount],KEEPFILTERS( Products[Color] = "Red" ) )

CALCULATE([SalesAmount],KEEPFILTERS (FILTER (ALL ( Products[Color]),Products[Color] = "Red")))

CALCULATE([SalesAmount],FILTER(VALUES( Products[Color] ),Products[Color] = "Red"))

Los tres valores de medida son coherentes en los resultados del cálculo. Cuando la función de la familia ALL se utiliza como filtro dentro de CALCULATE, se cancelará el efecto de filtrado del filtro externo. En este momento, KEEPFILTERS hará que el contexto externo vuelva a desempeñar un papel de selección. En términos de efecto de presentación de datos, es lo mismo que usar VALORES dentro de CALCULATE. Cuando se piensa en el uso de FILTER(VALUES(Col),Expression) para interactuar con el contexto externo, puede utilizar KEEPFILTERS(<Exprission>) en su lugar. La ventaja es que el código es más conciso y la velocidad de ejecución es mejor.

View solution in original post

5 REPLIES 5
v-stephen-msft
Community Support
Community Support

Hola @sjrrkb123 ,

KEEPFILTERS es un modificador de filtro que no elimina los filtros de columna o tabla existentes en el contexto de filtro que entran en conflicto con los filtros aplicados por el parámetro KEEPFILTERS.

Probablemente todavía se siente muy abstracto. Antes de explicar el uso específico de esta función, echemos un vistazo a un caso: Calcular las ventas de productos cuyo color es rojo. La mayoría de las personas escribirán la siguiente medida:

AlwaysRed =
CALCULATE ( 
 [SalesAmount], 
 Products[Color]= "Red"
)

Dentro del motor, esta expresión se transformará en la siguiente expresión:

AlwaysRed_Filter =
CALCULATE (
 [SalesAmount],
 FILTER(
 ALL( Products[Color] ),
 Products[Color]= "Red"
 )
)

En otras palabras, la función ALL dentro de CALCULATE elimina el filtrado de la columna Color por el filtro externo, y todos los filtros externos se calculan según el nuevo color del filtro como rojo.

Si no desea perder los filtros externos existentes, un método ampliamente utilizado es reemplazar ALL por VALUES, el código es el siguiente:

OnlyRed_Values =
CALCULATE (
 [SalesAmount],
 FILTER(
 VALUES( Products[Color] ),
 Products[Color]= "Red"
 )
)

Echemos un vistazo a cómo diferirán los resultados de varias funciones, como se muestra en la siguiente figura:

v2-b2ffefc353deed044bfc30c084861260_720w.jpg

En la medida AlwaysRed, debido a la existencia de ALL, el filtro rojo reemplaza el filtro de color del filtro externo, por lo que el resultado será el número de ventas de productos en rojo; y Values se utiliza en OnlyRed_Values, que no cancela el filtro de contexto externo, el resultado en este momento es el resultado de la interacción entre el contexto externo y el contexto interno. Tomando BLACK como ejemplo, el contexto externo filtra el negro y los filtros internos rojos. La intersección entre los dos está vacía, por lo que el resultado es 0.

Para el efecto logrado por OnlyRed_Values, también podemos utilizar KEEPFILTERS para lograr, primero mirar el código:

OnlyRed =
CALCULATE (
 [SalesAmount],
 KEEPFILTERS( Products[Color] = "Red" )
)

En consecuencia, este código es equivalente al código siguiente:

OnlyRed_KeepfiltersAll =
CALCULATE (
 [SalesAmount],
 KEEPFILTERS(
 FILTER(
 ALL( Products[Color] ),
 Products[Color]= "Red"
 )
 )
)

Vamos a reinterpreter este código a través de la descripción gramatical anterior de la función. ALL cancela el filtrado de color del contexto externo. Cuando el contexto externo entra en conflicto con el color, el filtro interno se utiliza en su lugar, pero la apariencia de KEEPFILTERS conserva el filtro externo. Filtre el color para que se calcule el mismo resultado que el valor de medida OnlyRed_Values.

Bien, para hacer un resumen simple:

CALCULATE([SalesAmount],KEEPFILTERS( Products[Color] = "Red" ) )

CALCULATE([SalesAmount],KEEPFILTERS (FILTER (ALL ( Products[Color]),Products[Color] = "Red")))

CALCULATE([SalesAmount],FILTER(VALUES( Products[Color] ),Products[Color] = "Red"))

Los tres valores de medida son coherentes en los resultados del cálculo. Cuando la función de la familia ALL se utiliza como filtro dentro de CALCULATE, se cancelará el efecto de filtrado del filtro externo. En este momento, KEEPFILTERS hará que el contexto externo vuelva a desempeñar un papel de selección. En términos de efecto de presentación de datos, es lo mismo que usar VALORES dentro de CALCULATE. Cuando se piensa en el uso de FILTER(VALUES(Col),Expression) para interactuar con el contexto externo, puede utilizar KEEPFILTERS(<Exprission>) en su lugar. La ventaja es que el código es más conciso y la velocidad de ejecución es mejor.

@v-stephen-msft te lo agradezco

Hola @sjrrkb123 ,

Muy feliz de ayudarle.

Saludos

Stephen Tao

Ashish_Mathur
Super User
Super User

Hola

Hay 2 desencadenadores para una función FILTER(). Una es resolver un conflicto que surge cuando se especifica algo en un filtro/slicer y algo más necesita filtrarse directamente en la función CALCULATE(). El otro es cuando desea probar las condiciones de filtro enriquecido (cualquier condición de filtro que no sea comparar una columna con un valor fijo). Su ejemplo es un caso perfecto de un filtro simple (comparar una columna con un valor fijo) y, por lo tanto, el primer formulario es lo que necesita. No utilizo KEEPFILTERS() por la misma razón citada por usted. Dicho esto, FILTER() es un iterador y, por lo tanto, en grandes conjuntos de datos, obstaculizará el rendimiento.

Espero que esto se aclare.


Regards,
Ashish Mathur
http://www.ashishmathur.com
https://www.linkedin.com/in/excelenthusiasts/
vivran22
Community Champion
Community Champion

Hey @sjrrkb123 ,

La fórmula 1 y 2 devolverá el mismo resultado. Finalmente, DAX convierte lo siguiente:

Calculate(SUM('Table 1'[Profit]), 'Customer'[Name] á "Bob"))

Como

Calculate(SUM('Table 1'[Profit]), FILTER (ALL(Customer),'Customer'[Name] á "Bob")))

Reemplaza cualquier filtro aplicado por el objeto visual.

mientras que KEEPFILTERS conserva el filtro aplicado por el objeto visual también. Puede consultar el siguiente artilce para obtener más detalles:

https://www.vivran.in/post/dax-keepfilters

¡Salud!
Vivek

Blog: vivran.in/my-blog
Conectarse en LinkedIn
Seguir en Twitter

Helpful resources

Announcements
PBI Sept Update Carousel

Power BI September 2023 Update

Take a look at the September 2023 Power BI update to learn more.

Learn Live

Learn Live: Event Series

Join Microsoft Reactor and learn from developers.

Top Solution Authors