Evitar el uso de FILTER como argumento de filtro

Como modelador de datos, es habitual que escriba expresiones DAX que se deban evaluar en un contexto de filtro modificado. Por ejemplo, puede escribir una definición de medida para calcular las ventas de "productos de margen alto". Este cálculo se describe más adelante.

Nota

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

Las funciones DAX CALCULATE y CALCULATETABLE son importantes y útiles. Le permiten escribir cálculos que quitan o agregan filtros, o que modifican las rutas de acceso de las relaciones. Se realiza pasando argumentos de filtro, que son expresiones booleanas, expresiones de tabla o funciones de filtro especiales. En este artículo solo trataremos las expresiones booleanas y de tabla.

Valore la siguiente definición de medida, que calcula las ventas de productos de color rojo mediante una expresión de tabla. Reemplazará todos los filtros que se puedan aplicar a la tabla Producto.

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

La función CALCULATE acepta una expresión de tabla devuelta por la función DAX FILTER, que evalúa su expresión de filtro para cada fila de la tabla Producto. Obtiene el resultado correcto: el de ventas de los productos rojos. Sin embargo, se podría lograr 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 función DAX KEEPFILTERS garantiza que se conservan los filtros existentes aplicados a la columna de 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. Se debe a que las tablas de modelo de importación son almacenes de columnas en memoria. Están optimizadas 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 pueden hacer referencia a una medida.
  • No pueden usar funciones CALCULATE anidadas.
  • No pueden usar funciones que examinen o devuelvan una tabla.

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

Tome ahora una definición de medida diferente. Esta vez, el requisito es calcular las ventas, pero solo para los meses en los que se haya logrado un beneficio.

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

En este ejemplo se debe usar la función FILTER. Se debe a que es necesario evaluar la medida Beneficio para eliminar los meses en los que no se logró un beneficio. No es posible usar una medida en una expresión booleana cuando se usa como un 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 función FILTER solo debe usarse cuando sea necesario. Puede utilizarla para realizar comparaciones de columnas complejas de filtro. Estas comparaciones de columnas pueden implicar:

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