Partilhar via


Evite usar FILTER como argumento de filtro

Como modelador de dados, é comum que você escreva DAX expressões 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 CALCULATE e CALCULATETABLEDAX 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 do Produto .

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

A função CALCULATE aceita uma expressão de tabela retornada pela função FILTERDAX, 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 KEEPFILTERSDAX garante que todos os filtros existentes aplicados à coluna Color 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. Isto acontece porque as tabelas de modelo de importação são armazenadas como colunas 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. Isto deve-se ao facto de que requer a avaliação da medida Profit 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 complexas de colunas através de filtro. Estas comparações de colunas podem envolver:

  • Medidas
  • Outras colunas
  • Usando a função ORDAX ou o operador lógico OR (||)