Evite usar FILTER como argumento de filtro

Como modelador de dados, você frequentemente escreverá expressões DAX que precisam ser avaliadas em um contexto de filtro modificado. Por exemplo, você pode escrever uma definição de medida para calcular as vendas de "produtos de alta margem". Descreveremos esse cálculo mais adiante neste artigo.

Observação

Este artigo é especialmente relevante para cálculos de modelo que aplicam filtros a tabelas de importação.

As funções DAX CALCULATE e CALCULATETABLE são funções importantes e úteis. Elas permitem que você escreva cálculos que removem ou adicionam filtros ou modificam os caminhos das relações. Isso é feito com a transmissão dos argumentos de filtro, que são expressões boolianas, expressões de tabela ou funções de filtro especiais. Abordaremos apenas as expressões boolianas e de tabela neste artigo.

Considere a definição de medida a seguir, que calcula as vendas de produtos vermelhos usando uma expressão de tabela. Ela substituirá todos os filtros que possam ser aplicados à tabela Product.

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

A função CALCULATE aceita uma expressão de tabela retornada pela função DAX FILTER, que avalia a expressão de filtro para cada linha da tabela Produto. Ela chega ao resultado correto: o resultado das vendas de produtos vermelhos. No entanto, isso pode ser alcançado de forma muito mais eficiente com uma expressão booliana.

Esta é uma definição de medida aprimorada, que usa uma expressão booliana em vez da expressão de tabela. A função KEEPFILTERS DAX garante que quaisquer filtros existentes aplicados à coluna Cores são preservados e não substituídos.

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

Recomendamos que você transmita argumentos de filtro como expressões boolianas, sempre que possível. Isso porque as tabelas de modelo de importação são repositórios de coluna na memória. Elas são explicitamente otimizadas para filtrar colunas com eficiência dessa maneira.

No entanto, há restrições que se aplicam a expressões boolianas quando elas são usadas como argumentos de filtro. Elas:

  • Não podem referenciar colunas de diversas tabelas
  • Não é possível referenciar uma medida
  • Não podem usar funções CALCULATE aninhadas
  • Não podem usar funções que examinam ou retornam uma tabela

Isso significa que você precisará usar expressões de tabela para requisitos de filtro mais complexos.

Considere agora outra definição de medida. O requisito é calcular as vendas, mas apenas nos meses que obtiveram lucro.

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

Neste exemplo, a função FILTER precisa ser usada. Isso porque ela exige a avaliação da medida Profit para eliminar os meses que não obtiveram um lucro. Não é possível usar uma medida em uma expressão booliana quando ela é usada como um argumento de filtro.

Recomendações

Para obter o melhor desempenho, recomendamos que você use expressões boolianas como argumentos de filtro, sempre que possível.

Portanto, a função FILTER só deve ser usada quando necessário. Você pode usá-la para fazer comparações de colunas complexas de filtro. Essas comparações de coluna podem envolver:

  • Medidas
  • Outras colunas
  • O uso da função DAX OR ou do operador lógico OR (||)