Pular para o conteúdo
Fynx
Power BI13 min de leitura

KEEPFILTERS e REMOVEFILTERS em DAX: o que faz e quando usar (com exemplos)

Guia prático de KEEPFILTERS e REMOVEFILTERS DAX: sintaxe, exemplos conceituais, armadilhas do contexto de filtro e boas práticas para medidas confiáveis.

F
Fynx

Sua medida devolve o número certo, mas no visual errado

Quem escreve DAX há algum tempo já viveu esta cena: a medida está impecável em um cartão isolado, você joga ela numa tabela com segmentações e o valor muda de comportamento sem aviso. O total não bate com a soma das linhas, um filtro de página parece ser ignorado, ou uma comparação percentual estoura para números absurdos. Na maioria das vezes o problema não é a fórmula de agregação. É o contexto de filtro, e é exatamente aí que KEEPFILTERS e REMOVEFILTERS DAX entram como as duas alavancas que decidem quais filtros sobrevivem e quais são removidos dentro de um CALCULATE.

Este artigo é para quem já entende CALCULATE no básico e quer parar de acertar por tentativa e erro. Vou explicar o que cada função faz, a sintaxe real, exemplos conceituais, as armadilhas que mais geram chamado de suporte e as boas práticas que aplicamos nos projetos da Fynx. Se você quer o panorama mais amplo de modelagem, vale ler também nosso conteúdo de boas práticas de modelagem e DAX, que serve de base para o que vem aqui.

O contexto de filtro é o que essas funções manipulam

Antes de falar das duas funções, é preciso ter clareza sobre o que elas alteram. Toda medida em Power BI é avaliada dentro de um contexto de filtro: o conjunto de restrições ativas naquele momento vindas de segmentações, linhas e colunas da matriz, filtros de página, filtros de visual e das relações do modelo. Uma célula de uma tabela dinâmica na intersecção de "Sudeste" e "2025" carrega esses dois filtros no seu contexto.

O CALCULATE é a única função em DAX capaz de modificar esse contexto de filtro. Tudo que você passa como argumento de filtro para o CALCULATE age sobre o contexto atual. O ponto que muita gente não internaliza é este: por padrão, um argumento de filtro dentro de CALCULATE substitui completamente qualquer filtro que já exista naquela coluna. Ele não soma, não intersecta, ele sobrescreve. É desse comportamento de sobrescrita que nascem as duas funções deste artigo. KEEPFILTERS muda a forma como o filtro é aplicado, de substituir para intersectar. REMOVEFILTERS faz o oposto do que o senso comum imagina: limpa filtros de propósito, geralmente para servir de denominador.

KEEPFILTERS preserva o contexto existente em vez de sobrescrever

KEEPFILTERS modifica a maneira como um filtro é aplicado dentro de CALCULATE. Em vez de substituir o filtro existente na coluna, ele faz a interseção entre o filtro que você está aplicando e o que já vinha do contexto.

A sintaxe é direta:

KEEPFILTERS(<expressão>)

O argumento normalmente é uma expressão de filtro que você colocaria dentro do CALCULATE. Um exemplo conceitual esclarece. Imagine uma medida que quer contar vendas apenas da categoria "Eletrônicos":

Vendas Eletronicos = CALCULATE([Total Vendas], KEEPFILTERS(Produto[Categoria] = "Eletronicos"))

Coloque essa medida numa matriz que tem Produto[Categoria] nas linhas. Sem o KEEPFILTERS, o argumento de filtro sobrescreveria a categoria da linha, e você veria o valor de "Eletrônicos" repetido em todas as linhas, inclusive nas de "Roupas" e "Alimentos". Com o KEEPFILTERS, a interseção entre "linha atual" e "Eletrônicos" resulta em vazio para as demais linhas, e o número aparece só onde faz sentido.

A tabela abaixo resume a diferença de comportamento na prática:

SituaçãoSem KEEPFILTERS (padrão)Com KEEPFILTERS
Filtro em coluna já filtrada pelo visualSubstitui o filtro do visualIntersecta com o filtro do visual
Linha "Roupas" numa matriz de categoriaMostra valor de "Eletrônicos"Mostra vazio (interseção vazia)
Filtro com valor fora do contexto atualTraz o valor mesmo assimRespeita o recorte da célula
Uso típicoForçar um valor fixoRestringir sem quebrar o visual

O caso de uso mais comum de KEEPFILTERS é quando você quer aplicar uma condição adicional sem apagar o que o usuário já selecionou. Pense em uma medida que conta clientes com ticket acima de um valor. Se o relatório tem uma segmentação de região ativa, você quer a contagem daquela região com ticket alto, não a contagem global com ticket alto. KEEPFILTERS garante que a condição de ticket se some ao recorte regional em vez de destruí-lo.

REMOVEFILTERS limpa o contexto para servir de base de comparação

REMOVEFILTERS faz o caminho inverso. Ela remove filtros do contexto, retornando o conjunto de dados como se aquele filtro nunca tivesse sido aplicado. Foi introduzida como uma função dedicada e mais legível para o que antigamente se fazia com ALL dentro de CALCULATE. Ela é, na prática, um ALL com nome mais honesto sobre a intenção.

A sintaxe aceita diferentes granularidades:

REMOVEFILTERS([<tabela> | <coluna>[, <coluna>[, …]]])

Você pode chamá-la de quatro formas:

  • REMOVEFILTERS() sem argumento remove todos os filtros do contexto da consulta.
  • REMOVEFILTERS(Tabela) remove os filtros de todas as colunas daquela tabela.
  • REMOVEFILTERS(Tabela[Coluna]) remove o filtro apenas daquela coluna.
  • Múltiplas colunas de uma mesma tabela em uma única chamada.

O uso clássico é o cálculo de participação percentual. Para saber quanto uma categoria representa do total, você precisa de um numerador que respeita o contexto e um denominador que ignora o filtro de categoria:

% do Total = DIVIDE([Total Vendas], CALCULATE([Total Vendas], REMOVEFILTERS(Produto[Categoria])))

Aqui o numerador continua sensível à linha da matriz, enquanto o denominador remove só o filtro de categoria e mantém os demais, como ano e região. Esse detalhe de remover uma coluna específica em vez de tudo é o que separa um percentual correto de um percentual enganoso. Se você usasse REMOVEFILTERS() sem argumento no denominador, o total ignoraria também o ano e a região selecionados, e a soma das participações deixaria de fechar 100% dentro do recorte.

A tabela a seguir mostra como a escolha do argumento muda o resultado:

ChamadaO que removeUso recomendado
REMOVEFILTERS()Todos os filtros da consultaTotal geral absoluto, ignorando qualquer seleção
REMOVEFILTERS(Calendario)Filtros de toda a dimensão de datasComparações que ignoram o período
REMOVEFILTERS(Produto[Categoria])Somente a coluna categoriaPercentual de participação por categoria
REMOVEFILTERS(Produto[Cor], Produto[Tamanho])Duas colunas específicasDenominador que ignora atributos, mantém o resto

Uma observação de motor que ajuda a raciocinar sobre custo: colunas de altíssima cardinalidade são armazenadas de forma menos compacta pelo VertiPaq, que comprime cada coluna conforme a repetição de valores. Remover filtros de uma dimensão inteira com muitas colunas de alta cardinalidade força o motor a reconsiderar um espaço maior. Não é motivo para pânico, mas é razão para preferir REMOVEFILTERS(Coluna) a REMOVEFILTERS(Tabela) quando você só precisa da coluna. Precisão de intenção costuma andar junto com desempenho.

As duas funções resolvem problemas opostos

É útil fixar o contraste antes de avançar para as armadilhas. As duas mexem no contexto de filtro, mas em direções contrárias e para finalidades diferentes.

AspectoKEEPFILTERSREMOVEFILTERS
Efeito no contextoPreserva e intersectaRemove
Comportamento vs. padrão do CALCULATEImpede a sobrescritaAmplia a limpeza
Pergunta que responde"Como isso se soma ao que já está filtrado?""Qual é o total ignorando este filtro?"
Cenário típicoCondição adicional em visual segmentadoDenominador de percentual e comparações
Equivalente históricoNão tem atalho antigo diretoFazia-se com ALL

As armadilhas que mais geram retrabalho

Aqui está onde a teoria encontra o chamado de suporte. Estas são as confusões que vemos com mais frequência.

A sobrescrita silenciosa. O erro número um é esquecer que o argumento de filtro do CALCULATE sobrescreve. Um desenvolvedor escreve CALCULATE([Vendas], Regiao[UF] = "SP") esperando "restringir a SP", coloca numa matriz por UF e leva um susto ao ver São Paulo replicado em todas as linhas. A correção é envolver com KEEPFILTERS quando a intenção é restringir, não fixar. Reserve a sobrescrita pura para quando você realmente quer ignorar a seleção do usuário, como um cartão que sempre mostra o Brasil inteiro.

REMOVEFILTERS demais no denominador. O segundo erro clássico é usar REMOVEFILTERS() ou ALL() sem argumento no denominador de um percentual. O número fica "certo" em telas simples e desaba quando alguém adiciona um filtro de ano na página. A regra prática: remova apenas a coluna cujo total você quer no denominador, nunca mais que o necessário.

Confundir REMOVEFILTERS com ALLSELECTED. São coisas diferentes. REMOVEFILTERS ignora o filtro por completo. ALLSELECTED respeita o que o usuário selecionou fora do visual e remove só o contexto interno do visual. Para um percentual que deve fechar 100% dentro da seleção do usuário, muitas vezes ALLSELECTED é o que você quer, não REMOVEFILTERS.

KEEPFILTERS em relações e propagação. KEEPFILTERS age sobre colunas no contexto de filtro. Ele não substitui o entendimento de como as relações propagam filtro pelo modelo. Se a direção de filtro entre duas tabelas não está correta no modelo em estrela, nenhuma das duas funções vai consertar isso. Modelagem primeiro, DAX depois.

Empilhar funções sem necessidade. Vejo medidas com KEEPFILTERS dentro de REMOVEFILTERS dentro de outro CALCULATE que ninguém mais entende. Cada camada de manipulação de contexto deve ter uma justificativa clara. Se você não consegue explicar em uma frase por que aquela função está ali, provavelmente ela não deveria estar.

Boas práticas que aplicamos nos projetos

Ao longo de dezenas de projetos de Power BI, algumas práticas se provaram consistentes. Elas valem tanto para quem está começando quanto para times que já têm um modelo semântico grande em produção.

  • Escreva a intenção antes da fórmula. Antes de digitar CALCULATE, responda: quero restringir dentro do que já está filtrado, ou quero ignorar um filtro específico? A resposta já aponta para KEEPFILTERS ou REMOVEFILTERS.
  • Prefira REMOVEFILTERS a ALL em código novo. O comportamento é o mesmo para remoção de filtro, mas REMOVEFILTERS comunica a intenção. Código legível é código com menos bug de manutenção.
  • Teste toda medida em uma matriz, não só em cartão. Um cartão isolado esconde os problemas de sobrescrita. Coloque a medida numa matriz com as dimensões relevantes nas linhas e confira se o total bate com a soma.
  • Nomeie medidas pela intenção de contexto. "% do Total Geral" e "% da Seleção" deixam claro para o próximo desenvolvedor qual denominador foi usado. O nome documenta a decisão de contexto.
  • Documente o denominador dos percentuais. Boa parte dos erros de relatório mora no denominador. Um comentário curto na medida explicando o que foi removido evita horas de investigação depois.

Essas práticas ficam mais fáceis de sustentar quando o modelo por baixo está bem construído. Um esquema em estrela limpo, com dimensões e fatos bem separados, reduz drasticamente a necessidade de manipular contexto na marra. É por isso que tratamos modelagem e DAX como parte do mesmo trabalho nos nossos projetos de Power BI e de analytics avançado.

Onde isso se conecta com o resto da plataforma

Vale um enquadramento de mercado para não tratar DAX como uma ilha. O Power BI faz parte de um ecossistema Microsoft amplo, e a Microsoft é reconhecida há anos como Líder no Quadrante Mágico do Gartner para plataformas de Analytics e BI. No Brasil, a penetração do pacote Microsoft ajuda a explicar a ampla adoção do Power BI nas empresas. O Microsoft Fabric, anunciado em 2023, trouxe o OneLake e modos como o Direct Lake, que lê os dados diretamente do OneLake sem importar nem consultar a fonte a cada interação.

Aqui vem um ponto que muita gente ignora: as funções de contexto de filtro que você domina em um modelo Import valem igualmente em Direct Lake. O DAX é o mesmo. O que muda é a origem e o custo de leitura dos dados, medido em Fabric por Capacity Units em SKUs como F2 a F2048, ou o dimensionamento por usuário no Power BI Pro e no PPU, além das capacidades Premium P1 a P5. Ou seja, aprender a controlar contexto com KEEPFILTERS e REMOVEFILTERS é um investimento que atravessa a evolução da plataforma. Se você está avaliando esse cenário maior, temos um material sobre o que é o Microsoft Fabric e se vale a pena e um guia completo de Power BI para empresas no Brasil.

Perguntas frequentes

KEEPFILTERS e REMOVEFILTERS podem ser usadas juntas na mesma medida? Sim, e é comum em cálculos mais elaborados. Você pode, por exemplo, remover o filtro de uma coluna para compor um denominador e, em outra parte da mesma expressão, usar KEEPFILTERS para restringir uma condição sem apagar a seleção do usuário. O importante é que cada uso tenha uma justificativa clara. Se você não consegue explicar por que cada função está ali, simplifique.

Qual a diferença entre REMOVEFILTERS e ALL? Para remover filtro do contexto, o comportamento é praticamente idêntico. A diferença é semântica e de legibilidade. ALL também é usada como função de tabela em iterações, o que pode confundir. REMOVEFILTERS existe justamente para deixar explícito que a intenção ali é remover filtro. Em código novo, prefira REMOVEFILTERS.

Por que meu total não bate com a soma das linhas quando uso KEEPFILTERS? Normalmente é o contrário: KEEPFILTERS costuma fazer o total bater, porque respeita o contexto de cada célula. Se o seu total não bate, o mais provável é que exista uma sobrescrita de filtro em algum CALCULATE sem KEEPFILTERS, fazendo linhas mostrarem um valor fixo. Revise cada argumento de filtro e pergunte se ele deveria intersectar em vez de substituir.

REMOVEFILTERS deixa a medida mais lenta? Depende do que você remove. Remover uma coluna específica costuma ter custo baixo. Remover uma tabela inteira com muitas colunas de alta cardinalidade obriga o motor VertiPaq a considerar um espaço maior de valores. A recomendação é sempre remover o mínimo necessário, preferindo REMOVEFILTERS(Coluna) a REMOVEFILTERS(Tabela) quando dá.

Quando devo usar ALLSELECTED em vez de REMOVEFILTERS? Use ALLSELECTED quando quiser um denominador que respeita o que o usuário selecionou fora do visual, mas ignora o recorte interno das linhas e colunas do visual. É o caso típico de um percentual que precisa fechar 100% dentro da seleção. REMOVEFILTERS ignora o filtro por completo, o que é o que você quer para um total absoluto que não deve reagir a segmentação nenhuma.

Essas funções servem também para modelos em Direct Lake no Fabric? Sim. O DAX é o mesmo independentemente do modo de armazenamento, seja Import, DirectQuery ou Direct Lake. O que muda é como os dados são lidos e o custo dessa leitura, medido em Capacity Units no Fabric. A lógica de contexto de filtro que você aprende aqui vale igual, o que torna esse conhecimento durável frente à evolução da plataforma.

Controle de contexto é o que separa relatório confiável de relatório bonito

KEEPFILTERS preserva e intersecta, REMOVEFILTERS remove e serve de base. Duas alavancas opostas para o mesmo problema: fazer a medida devolver o número certo em qualquer visual, não só no cartão de teste. O caminho para dominar isso não é decorar sintaxe, é ter clareza da intenção de contexto antes de escrever a fórmula, e um modelo em estrela bem construído por baixo.

Se a sua equipe convive com totais que não batem, percentuais que estouram ou medidas que ninguém mais entende, esse é exatamente o tipo de problema que resolvemos no dia a dia. Fale com a gente e vamos olhar o seu modelo juntos.

Quer aplicar isso na sua empresa?

A Fynx implementa BI, Power BI e Power Platform de ponta a ponta. Conte seu cenário e devolvemos um diagnóstico direto ao ponto.

Falar com um especialista

Vamos transformar seus dados em decisão?

Conte seu cenário. Devolvemos um diagnóstico e uma proposta com faixa de investimento em poucos dias úteis, sem folheto, direto ao ponto.