Compartir a través de


Evite usar FILTER como argumento de filtro

Como modelador de datos, es habitual escribir DAX expresiones que deben evaluarse en un contexto de filtro modificado. Por ejemplo, puede escribir una definición de medida para calcular las ventas de "productos de margen alto". Describiremos este cálculo más adelante en este artículo.

Nota:

Este artículo es especialmente relevante para los cálculos de modelos que aplican filtros a las tablas de importación.

Las CALCULATE funciones y CALCULATETABLEDAX son funciones importantes y útiles. Permiten escribir cálculos que quiten o agreguen filtros, o modifiquen rutas de relación. Para ello, se pasan argumentos de filtro, que son expresiones booleanas, expresiones de tabla o funciones de filtro especiales. En este artículo solo se describen las expresiones booleanas y de tabla.

Tenga en cuenta la siguiente definición de medida, que calcula las ventas de productos rojos mediante una expresión de tabla. Reemplazará los filtros que se puedan aplicar a la tabla Product .

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

La CALCULATE función acepta una expresión de tabla devuelta por la FILTERDAX función , que evalúa su expresión de filtro para cada fila de la tabla Product . Logra el resultado correcto, el resultado de ventas de los productos rojos. Sin embargo, podría lograrse de forma mucho más eficaz mediante el uso de una expresión booleana.

Esta es una definición de medida mejorada, que usa una expresión booleana en lugar de la expresión de tabla. La KEEPFILTERSDAX función garantiza que se conserven los filtros existentes aplicados a la columna Color y no se sobrescriban.

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

Se recomienda pasar argumentos de filtro como expresiones booleanas siempre que sea posible. Esto se debe a que las tablas del modelo de importación se almacenan como columnas en memoria. Se optimizan explícitamente para filtrar de forma eficaz las columnas de esta manera.

Sin embargo, hay restricciones que se aplican a expresiones booleanas cuando se usan como argumentos de filtro. Son las siguientes:

  • No se puede hacer referencia a columnas de varias tablas
  • No se puede hacer referencia a una medida
  • No se pueden usar funciones anidadas CALCULATE
  • No se pueden usar funciones que examinan o devuelven una tabla

Esto significa que deberá usar expresiones de tabla para requisitos de filtro más complejos.

Considere ahora una definición de medida diferente. El requisito es calcular las ventas, pero solo durante meses que han logrado un beneficio.

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0
    )
)

En este ejemplo, se debe usar la FILTER función . Es porque requiere evaluar la medida Profit para eliminar los meses que no lograron un beneficio. No es posible usar una medida en una expresión booleana cuando se usa como argumento de filtro.

Recomendaciones

Para obtener el mejor rendimiento, se recomienda usar expresiones booleanas como argumentos de filtro siempre que sea posible.

Por lo tanto, la FILTER función solo se debe usar cuando sea necesario. Puede utilizarlo para realizar comparaciones complejas de columnas mediante filtros. Estas comparaciones de columnas pueden implicar:

  • Medidas
  • Otras columnas
  • Uso de la ORDAX función o el OR operador lógico (||)