Evite usar FILTER como um argumento de filtro
Como um 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 para "produtos de margem alta". 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 CALCULATETABLEDAX são funções importantes e úteis. Eles permitem que você escreva cálculos que removam ou adicionem filtros ou modifiquem caminhos de relação. Isso é feito passando argumentos de filtro, que são expressões boolianas, expressões de tabela ou funções de filtro especiais. Discutiremos 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 FILTERDAX, que avalia sua expressão de filtro para cada linha da tabela Product. Ele obtém o resultado correto: o resultado de vendas de produtos vermelhos. No entanto, ela poderia ser obtida com muito mais eficiência usando uma expressão booliana.
Aqui está uma definição de medida aprimorada, que usa uma expressão booliana em vez da expressão de tabela. A função KEEPFILTERS do DAX garante que todos os filtros 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 boolianas, sempre que possível. Isso porque as tabelas de modelo de importação são repositórios de coluna na memória. Eles são explicitamente otimizados 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. Eles:
- Não é possível referenciar colunas de várias tabelas
- Não é possível fazer referência a uma medida
- Não é possível usar as 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. O requisito é calcular as vendas, mas apenas por meses que obtiveram lucro.
Sales for Profitable Months =
CALCULATE(
[Sales],
FILTER(
VALUES('Date'[Month]),
[Profit] > 0
)
)
Neste exemplo, a função FILTER deve 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 melhor desempenho, é recomendável usar 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
- Usando a função ORDAX ou o operador lógico OR (||)
Conteúdo relacionado
- Funções do Filtro (DAX)
- Roteiro de aprendizagem: Usar o DAX no Power BI Desktop
- Perguntas? Experimente perguntar à Comunidade do Power BI
- Sugestões? Contribua com ideias para melhorar o Power BI