Avoid using FILTER as a filter argument (Evitar utilizar FILTER como um argumento de filtro)

Como modelador de dados, é comum que você escreva 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.

Nota

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

As funções CALCULATE e CALCULATETABLE DAX são funções importantes e úteis. Eles permitem que você escreva cálculos que removem ou adicionam filtros, ou modificam caminhos de relacionamento. Isso é feito passando argumentos de filtro, que são expressões booleanas, expressões de tabela ou funções de filtro especiais. Discutiremos apenas expressões booleanas e de tabela neste artigo.

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

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

A função CALCULATE aceita uma expressão de tabela retornada pela função FILTER DAX, que avalia sua expressão de filtro para cada linha da tabela Product . Ele alcança o resultado correto – o resultado de vendas de produtos vermelhos. No entanto, poderia ser alcançado de forma muito mais eficiente usando uma expressão booleana.

Aqui está uma definição de medida aprimorada, que usa uma expressão booleana em vez da expressão de tabela. A função KEEPFILTERS DAX garante que todos os filtros existentes aplicados à coluna Cor sejam preservados e não substituídos.

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

É recomendável passar argumentos de filtro como expressões booleanas, sempre que possível. Isso ocorre porque as tabelas de modelo de importação são armazenamentos de coluna na memória. Eles são explicitamente otimizados para filtrar colunas de forma eficiente dessa maneira.

Há, no entanto, restrições que se aplicam a expressões booleanas quando elas são usadas como argumentos de filtro. Eles:

  • Não é possível fazer referência a colunas de várias tabelas
  • Não é possível fazer referência a uma medida
  • Não é possível usar funções CALCULATE aninhadas
  • Não é possível usar funções que verificam ou retornam uma tabela

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

Considere agora uma definição de medida diferente. A exigência é calcular as vendas, mas apenas para os meses que alcançaram lucro.

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

Neste exemplo, a função FILTER deve ser usada. É porque é necessário avaliar a medida de lucro para eliminar os meses que não alcançaram lucro. Não é possível usar uma medida em uma expressão booleana quando ela é usada como um argumento de filtro.

Recomendações

Para obter o melhor desempenho, é recomendável usar expressões booleanas como argumentos de filtro, sempre que possível.

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