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

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

Guia prático de RANKX DAX: sintaxe, exemplos conceituais, armadilhas de contexto e boas práticas para criar rankings dinâmicos no Power BI.

F
Fynx

Por que seu ranking no Power BI muda quando o usuário filtra e ninguém sabe explicar

Todo relatório sério em algum momento precisa responder "quem está em primeiro". Melhor produto por faturamento, vendedor com maior margem, filial que mais cresceu. Parece trivial até você tentar fazer no Power BI e descobrir que a coluna calculada que você criou não reage a filtro nenhum, ou que a medida devolve o número 1 para todas as linhas. É aqui que entra o RANKX DAX, a função que classifica valores dentro de uma tabela e é a base de praticamente todo ranking dinâmico decente no Power BI.

O problema não é a função em si. RANKX é razoavelmente simples de escrever. O problema é que ela vive dentro do motor de contexto do DAX, e ranking é justamente o tipo de cálculo mais sensível a contexto que existe. Você não está pedindo "qual o valor desta linha", está pedindo "qual a posição desta linha em relação a todas as outras". Isso obriga o DAX a olhar para fora da linha atual, e é aí que a maioria das pessoas erra.

Neste artigo vou explicar o que a função faz de verdade, a sintaxe completa, exemplos conceituais que aparecem em qualquer projeto real, e as armadilhas que fazem gente sênior perder tarde inteira. Sem enrolação.

O que a função RANKX realmente faz

RANKX percorre uma tabela, calcula uma expressão para cada linha dessa tabela, ordena os resultados e devolve a posição de um valor específico dentro dessa ordenação. Ela é uma função iteradora, ou seja, trabalha linha a linha, da mesma família de SUMX, AVERAGEX e FILTER.

A sintaxe completa é esta:

RANKX(<tabela>, <expressão>, [<valor>], [<ordem>], [<empate>])

Os cinco argumentos:

ArgumentoObrigatórioO que faz
tabelaSimA tabela sobre a qual a classificação é feita. Quase sempre gerada por ALL, ALLSELECTED ou VALUES.
expressãoSimO cálculo avaliado para cada linha da tabela, geralmente uma medida de valor.
valorNãoO valor cuja posição você quer descobrir. Se omitido, o DAX usa a expressão avaliada no contexto atual.
ordemNãoASC ou DESC. O padrão é DESC, ou seja, o maior valor recebe posição 1.
empateNãoSkip ou Dense. Define como o rank se comporta quando há valores iguais.

Na prática, 90 por cento das medidas de ranking usam só os dois primeiros argumentos mais o quarto. O segredo está no primeiro: qual tabela você passa. Ele decide o universo dentro do qual a comparação acontece.

A sintaxe mínima que funciona e por que ALL importa tanto

Imagine um modelo com uma tabela de produtos e uma medida Total Vendas. O ranking de produtos por vendas seria assim:

Rank Produtos = RANKX(ALL(Produtos[Nome]), [Total Vendas])

O ALL(Produtos[Nome]) é a peça central. Ele remove qualquer filtro sobre a coluna de nome do produto e devolve a lista completa de produtos. Sem isso, o RANKX enxergaria apenas o produto da linha atual da matriz, compararia esse produto com ele mesmo e devolveria 1 para tudo. Esse é o erro número um de quem começa: esquecer que dentro de uma matriz o contexto de linha já filtra a tabela, e sem ALL não há ninguém para comparar.

Vale fixar a diferença entre as funções de remoção de contexto, porque a escolha muda o resultado que o usuário vê:

FunçãoComportamentoQuando usar
ALLIgnora todos os filtros da coluna ou tabelaRanking global, independente de segmentações
ALLSELECTEDRespeita filtros externos (segmentações) mas ignora o contexto interno do visualRanking dentro do que o usuário selecionou
VALUESMantém o contexto de filtro atualRanking dentro de um subgrupo já filtrado

Essa tabela resume uma decisão de negócio, não só técnica. Se o usuário aplica um segmentador de categoria e espera que o ranking se recalcule só para aquela categoria, você quer ALLSELECTED. Se ele espera a posição absoluta do produto no catálogo inteiro mesmo com o filtro ativo, você quer ALL. Trocar uma pela outra sem entender isso gera aquele relatório que "está com o número errado" e ninguém acha o motivo.

Rankings dinâmicos exigem uma medida, nunca uma coluna calculada

Este é o ponto que separa o ranking que funciona do que decepciona. Uma coluna calculada é avaliada uma única vez, quando os dados são carregados ou atualizados, e o resultado fica gravado no modelo. Ela não sabe que existe um segmentador na tela. Como coluna calculada, o rank será sempre o mesmo, congelado, indiferente ao que o usuário faz.

Uma medida é avaliada em tempo de consulta, toda vez que o visual renderiza, dentro do contexto de filtro daquele momento. Por isso ranking dinâmico é obrigatoriamente uma medida. O usuário filtra por região, a medida recalcula. Muda o período, recalcula de novo. Esse recálculo constante é a definição de dinâmico.

O motor VertiPaq, que comprime as colunas do modelo por cardinalidade e sustenta a performance do Power BI, armazena colunas calculadas fisicamente. Isso significa que uma coluna de rank ocupa memória e não entrega flexibilidade nenhuma. A medida não ocupa espaço no modelo e faz o trabalho certo. A regra é simples: ranking que precisa reagir a filtro é medida, ponto. Se você quer se aprofundar na disciplina por trás dessas escolhas, vale ler nosso material sobre modelagem e boas práticas de DAX no Power BI.

Exemplos conceituais que aparecem em projeto de verdade

Vou passar pelos casos que mais recebo em consultoria, do mais comum ao mais traiçoeiro.

Ranking simples de produtos

Rank Vendas = RANKX(ALL(Produtos[Nome]), [Total Vendas], , DESC)

O maior faturamento vira posição 1. Direto ao ponto. Coloque essa medida numa matriz com os nomes dos produtos nas linhas e cada um recebe sua posição correta.

Ranking que respeita a segmentação do usuário

Rank Selecionado = RANKX(ALLSELECTED(Produtos[Nome]), [Total Vendas], , DESC)

Se houver um segmentador de categoria na página, o ranking se recalcula dentro da categoria escolhida. É o comportamento que a maioria dos executivos espera quando explora um dashboard, e por isso costuma ser a escolha padrão em relatórios interativos.

Ranking dentro de grupos com contexto preservado

Quando você quer o rank do produto dentro da própria categoria, e não no catálogo todo, o truque é manter a categoria no contexto e liberar só o produto. Uma abordagem é usar ALLEXCEPT ou combinar ALL apenas na coluna de produto enquanto a categoria permanece filtrada pelo próprio visual. Essa é a diferença entre "5º produto da empresa" e "5º produto dentro de Bebidas", e confundir os dois é fonte constante de erro em relatórios de portfólio.

Filtrar o Top N mantendo o total correto

Um pedido clássico: mostrar só os 10 maiores clientes, mas com o cartão de faturamento total continuando a somar todos. Você combina RANKX com uma medida que testa a posição:

Vendas Top 10 = IF([Rank Clientes] <= 10, [Total Vendas])

Aqui mora uma sutileza. Se você usar essa lógica dentro de CALCULATE com FILTER sobre a tabela inteira, o ranking passa a ser calculado sobre milhares de linhas por célula do visual e a consulta fica lenta. Em modelos grandes, esse Top N mal escrito é uma das causas mais frequentes de dashboard que trava, e otimizá-lo é o tipo de trabalho que fazemos em projetos de analytics avançado.

As armadilhas que fazem gente experiente perder tempo

Ranking concentra uma quantidade desproporcional de pegadinhas. Estas são as que mais aparecem.

Empates e o parâmetro de tie-break. Por padrão, RANKX usa o modo Skip. Se dois produtos empatam em segundo lugar, ambos recebem posição 2 e a próxima posição pula para 4. O modo Dense faria a próxima posição ser 3. Nenhum dos dois está errado, mas eles respondem perguntas diferentes. Skip preserva a noção de "quantos estão acima de mim". Dense preserva a noção de "quantos valores distintos existem". Defina isso com a área de negócio antes de escrever a fórmula, porque mudar depois costuma gerar retrabalho e desconfiança no número.

Valores em branco e granularidade. Se a expressão devolve BLANK para algumas linhas, essas linhas ainda entram na classificação e podem receber uma posição, o que polui o resultado. Um produto sem venda no período pode aparecer com rank em vez de ficar de fora. Trate os brancos explicitamente, filtrando a tabela do primeiro argumento ou testando o valor antes de exibir o rank.

Granularidade errada no primeiro argumento. Passar ALL(Produtos) em vez de ALL(Produtos[Nome]) muda o nível em que o DAX classifica. Se a tabela tem várias colunas com cardinalidades diferentes, o rank pode ser calculado numa granularidade que não corresponde ao visual, gerando posições sem sentido. Classifique sempre na mesma granularidade que aparece nas linhas.

Total geral com valor estranho. Na linha de total da matriz, o contexto de linha do produto some, e o RANKX tenta classificar um valor agregado dentro da lista de produtos. O resultado costuma ser um número sem significado. A prática correta é esconder o rank no total com IF(HASONEVALUE(Produtos[Nome]), <sua medida de rank>), que só exibe a posição quando há um único produto no contexto.

Performance em cardinalidade alta. RANKX materializa a tabela do primeiro argumento e avalia a expressão para cada linha. Numa dimensão com centenas de milhares de valores distintos, isso pesa. Quando o ranking precisa rodar sobre volumes assim, a resposta raramente é uma fórmula mais esperta, e sim revisar o modelo de dados. Boa modelagem resolve mais problema de performance do que qualquer otimização de medida isolada.

Boas práticas para rankings que não voltam como bug

Depois de muitos projetos, o que separa o ranking robusto do frágil é disciplina, não sofisticação. Estas são as regras que aplicamos:

  • Escreva ranking sempre como medida, nunca como coluna calculada, quando o resultado precisa reagir a filtro.
  • Decida conscientemente entre ALL e ALLSELECTED com base na expectativa do usuário, não no que apareceu primeiro no Stack Overflow.
  • Esconda o rank na linha de total com HASONEVALUE para não exibir números sem sentido.
  • Combine com o parâmetro de empate coerente com a pergunta de negócio, Skip ou Dense, e documente a escolha.
  • Trate valores em branco antes que eles entrem na classificação.
  • Teste o comportamento com segmentadores ativos antes de publicar, porque ranking que parece certo sem filtro pode quebrar com filtro.

Vale um lembrete sobre governança. Ranking costuma alimentar decisão de bônus, ranking de fornecedor, priorização de conta. Quando o número vira base de decisão sensível, a rastreabilidade da regra importa tanto quanto a fórmula, e isso se conecta com práticas de governança de dados e conformidade com a LGPD, a Lei nº 13.709/2018, especialmente quando o ranking envolve dados de pessoas. Uma medida bem escrita que ninguém consegue auditar ainda é um risco.

RANKX no ecossistema Microsoft e por que ele continua relevante

A função existe desde as primeiras versões do DAX e continua sendo a ferramenta padrão para classificação no Power BI, que é a plataforma de BI mais adotada no mercado brasileiro pela penetração do ecossistema Microsoft e pelo reconhecimento da Microsoft como Líder no Quadrante Mágico do Gartner para plataformas de Analytics e BI. Mesmo com a chegada do Microsoft Fabric, anunciado em 2023, e do modo Direct Lake que lê direto do OneLake, a lógica de contexto do DAX permanece idêntica. RANKX se comporta da mesma forma, e quem domina contexto de filtro leva esse conhecimento para qualquer camada do stack.

Se a sua operação avalia modernizar a plataforma de dados, entender como o DAX se comporta nos diferentes modos de armazenamento faz parte da conta, e cobrimos esse cenário no nosso guia sobre Microsoft Fabric. Para times que estão estruturando o Power BI do zero, nosso trabalho de consultoria em Power BI parte desse tipo de fundamento.

Perguntas frequentes

RANKX funciona em coluna calculada ou só em medida? Funciona nas duas, mas com propósitos diferentes. Em coluna calculada o rank fica gravado no modelo e nunca reage a filtro, útil apenas para uma classificação estática e fixa. Para ranking dinâmico, que recalcula quando o usuário filtra, você precisa obrigatoriamente de uma medida avaliada em tempo de consulta.

Por que meu RANKX retorna 1 para todas as linhas? Quase sempre porque você não removeu o contexto de filtro do primeiro argumento. Dentro de uma matriz, cada linha já filtra a tabela para um único item, então o RANKX compara o item com ele mesmo. A correção é envolver a coluna com ALL ou ALLSELECTED para abrir o universo de comparação.

Qual a diferença entre ALL e ALLSELECTED no ranking? ALL ignora todos os filtros e gera um ranking absoluto, independente de segmentações na página. ALLSELECTED respeita os filtros externos que o usuário aplicou, mas ignora o contexto interno do visual, produzindo um ranking relativo ao que foi selecionado. A escolha depende da expectativa de negócio.

Como faço um Top 10 sem quebrar o total do relatório? Crie a medida de rank com RANKX e use uma medida separada que teste a posição, exibindo o valor só quando o rank for menor ou igual a 10. O cartão de total continua usando a medida original de soma, então ele soma tudo enquanto a tabela mostra apenas os dez maiores.

Como lidar com empates no RANKX? Pelo quinto argumento, escolhendo entre Skip, o padrão, e Dense. Skip pula posições após um empate, preservando quantos itens estão acima. Dense mantém a sequência sem pular, contando valores distintos. Defina isso junto com a área de negócio, porque as duas opções respondem perguntas diferentes.

RANKX é lento em modelos grandes? Pode ser, porque ele avalia a expressão para cada linha da tabela do primeiro argumento. Em dimensões com cardinalidade muito alta, o custo cresce. Nesses casos, a solução costuma estar na modelagem de dados e não em reescrever a fórmula, o tipo de diagnóstico que fazemos em projetos de engenharia de dados.

Fechamento

RANKX não é uma função difícil. O que é difícil é o contexto de filtro em que ela opera, e ranking é o cálculo que mais expõe qualquer erro de contexto. Domine ALL versus ALLSELECTED, trate empates e brancos com intenção, esconda o total sem sentido e teste sempre com filtro ativo. Feito isso, seus rankings param de voltar como bug.

Se o seu time convive com medidas que ninguém entende ou dashboards que travam quando o volume cresce, fale com a gente. A Fynx já entregou mais de 2.000 soluções Microsoft em 6 anos de mercado, e resolver esse tipo de problema é o nosso dia a dia.

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.