TOPN em DAX: o que faz e quando usar (com exemplos)
Entenda TOPN DAX na prática: sintaxe, exemplos conceituais para trazer os N maiores de uma medida, armadilhas de empate e ordenação, e boas práticas.
Todo mundo quer o "top 10", e é aí que o Power BI começa a mentir
Em algum momento alguém da diretoria vai pedir os 10 maiores clientes, os 5 produtos que mais vendem ou as 3 filiais que puxam o resultado para baixo. Parece trivial. Você arrasta o campo, ordena decrescente, filtra o visual para mostrar 10 linhas e entrega. Só que na próxima reunião o total do "top 10" não bate com nada, o número muda quando alguém clica numa segmentação e o "maior cliente" some quando você troca o período. É nesse tipo de armadilha que TOPN DAX entra: é a função feita para trazer os N maiores (ou menores) de uma medida de forma controlada, dentro do cálculo, e não como um truque visual frágil.
Neste artigo vou explicar o que TOPN realmente faz, mostrar a sintaxe com exemplos conceituais, apontar as armadilhas que mais derrubam gente boa (empates, ordenação instável, uso ingênuo em cartões) e fechar com boas práticas de quem entrega isso em projeto real. Se você quer o panorama maior antes de mergulhar aqui, vale ler nosso guia de modelagem e boas práticas de DAX.
TOPN é uma função de tabela, não um filtro visual
O primeiro conceito que precisa ficar claro: TOPN não é um botão de "mostrar top 10" no visual. TOPN é uma função de tabela. Ela recebe uma tabela, ordena por uma ou mais expressões e devolve uma nova tabela contendo apenas as N primeiras linhas segundo aquela ordenação. O resultado é uma tabela, não um número.
Isso muda tudo na forma como você a usa. O filtro de "top N" que você configura no painel de filtros do Power BI (aquele Filtragem N Principais) é conveniente para um visual isolado, mas ele vive só naquele visual. Você não consegue reaproveitar, não consegue somar o resultado, não consegue usar em outra medida. TOPN vive dentro do DAX, então você pode encapsular a lógica numa medida, alimentar outra função de agregação com ela e ter controle total sobre o que entra e o que fica de fora.
A sintaxe é esta:
TOPN(N, tabela, ordenar_por_1, [ordem_1], [ordenar_por_2], [ordem_2], ...)
Os parâmetros:
| Parâmetro | O que é | Obrigatório |
|---|---|---|
| N | Quantidade de linhas a retornar (número ou expressão que devolve número) | Sim |
| tabela | A tabela de onde vêm as linhas (uma tabela do modelo ou uma expressão de tabela) | Sim |
| ordenar_por | A expressão usada para ordenar (geralmente uma medida ou coluna) | Não, mas quase sempre necessário na prática |
| ordem | ASC para crescente, DESC para decrescente (o padrão é DESC) | Não |
Repare em dois detalhes que a documentação da Microsoft deixa explícitos e que a maioria ignora. Primeiro: o padrão de ordenação é DESC, ou seja, TOPN já assume que você quer os maiores. Para pegar os menores, você passa ASC. Segundo: TOPN não garante ordenação do resultado. Ela garante quais linhas voltam, não em que ordem elas voltam. Quem ordena a exibição é o visual. Confundir isso gera bug.
Como TOPN se comporta na prática: N linhas, sem promessa de ordem
Imagine uma tabela de vendas por cliente. Você quer os 5 clientes com maior faturamento. Em DAX conceitual:
TOPN(5, VALUES(Clientes[Nome]), [Faturamento], DESC)
O que acontece aqui: o VALUES(Clientes[Nome]) gera a lista de clientes visível no contexto atual, TOPN avalia a medida [Faturamento] para cada um, ordena de forma decrescente e devolve os 5 primeiros nomes. Como TOPN devolve uma tabela, você raramente a usa sozinha. O padrão mais comum é envolvê-la com uma função de agregação. Por exemplo, para somar o faturamento apenas desses 5 clientes:
CALCULATE([Faturamento], TOPN(5, VALUES(Clientes[Nome]), [Faturamento], DESC))
Aqui a tabela devolvida por TOPN vira um filtro dentro de CALCULATE. É o casamento clássico: TOPN escolhe quem entra, CALCULATE recalcula a medida restringindo o modelo àquelas linhas. Se o conceito de reescrever contexto de filtro ainda soa nebuloso, o companheiro natural deste artigo é o nosso texto sobre o que CALCULATE faz e quando usar.
Um ponto que vale gravar: quando existe empate na posição de corte, TOPN retorna todas as linhas empatadas naquela fronteira. Ou seja, se você pediu top 5 e o quinto e o sexto colocados têm exatamente o mesmo valor, TOPN devolve 6 linhas, não 5. Isso é comportamento documentado e proposital, e é a origem de muita confusão quando o usuário jura que pediu 5 e apareceram 6.
Os cenários em que TOPN ganha da concorrência
TOPN não é a única forma de fazer ranking em DAX. RANKX numera posições, e o filtro visual resolve casos simples. A pergunta certa é quando cada um vale a pena.
| Você precisa de | Ferramenta recomendada | Por quê |
|---|---|---|
| Mostrar top 10 num único visual, sem reuso | Filtro N Principais do visual | Rápido, zero DAX, mas não reaproveitável |
| Somar/agregar apenas os N melhores dentro de uma medida | TOPN dentro de CALCULATE | Devolve tabela filtrável, integra com agregações |
| Exibir a posição (1º, 2º, 3º) de cada linha | RANKX | Devolve o número da posição, não a tabela |
| Top N dinâmico, com N vindo de uma segmentação | TOPN com N parametrizado | Aceita expressão no primeiro argumento |
| Categoria "Outros" agrupando o que ficou de fora | TOPN combinado com EXCEPT ou lógica de complemento | Você controla explicitamente o que entra e o que sobra |
O caso que mais justifica TOPN é o quarto: top N dinâmico. Como o primeiro argumento aceita uma expressão, você pode ligar o N a um parâmetro de campo ou a uma medida que lê uma segmentação. O usuário arrasta um controle de 3 a 20 e a medida responde. Isso é impossível de fazer com o filtro visual estático de forma elegante.
O quinto caso, a linha "Outros", é onde consultoria sênior aparece. Você monta o top 5 com TOPN, calcula o total geral e subtrai. O resultado é honesto: a soma das barras fecha com o total, coisa que o filtro visual quebra silenciosamente.
As armadilhas que transformam TOPN em bug de produção
Vou ser direto: a maioria dos problemas com TOPN não é da função, é de expectativa errada sobre o que ela promete.
A ordenação do resultado não existe. TOPN garante quais linhas voltam, não a ordem. Se você usa a tabela de TOPN para alimentar outra lógica que depende da sequência, vai se frustrar. Quem ordena a exibição é o visual, com seu próprio critério de classificação. Nunca conte com a ordem interna de uma tabela DAX.
Empates inflam o resultado. Já falamos: top 5 pode devolver 6, 7, 8 linhas se houver empate na fronteira. Em dados financeiros com centavos isso é raro, mas em contagens inteiras (número de pedidos, quantidade de itens) empates são frequentes. Se o negócio exige exatamente N linhas, você precisa de um critério de desempate. A saída é adicionar uma segunda expressão de ordenação, algo único como um ID ou a data mais recente, para quebrar o empate de forma determinística.
Ordenar por uma medida volátil dá resultado instável. Se a expressão de ordenação depende do contexto de filtro do visual, o conjunto de "top N" muda conforme o usuário interage. Isso pode ser exatamente o que você quer, ou pode ser um pesadelo de suporte quando o usuário reclama que "o cliente sumiu". Deixe explícito no design se o ranking é fixo ou contextual.
Usar TOPN num cartão sem CALCULATE não faz sentido. TOPN devolve tabela. Um cartão espera um escalar. Você precisa envolver com uma agregação (SUMX, CALCULATE, COUNTROWS). Esquecer disso gera erro ou um número que não significa o que você pensa.
Cardinalidade importa para performance. TOPN precisa avaliar a expressão de ordenação para cada linha da tabela de entrada antes de cortar. Se você joga uma tabela de milhões de linhas de alta cardinalidade direto no TOPN, o motor VertiPaq até comprime bem as colunas por cardinalidade, mas a avaliação linha a linha da medida ainda custa. Prefira alimentar TOPN com a granularidade certa: uma lista de clientes ou produtos, não a fato inteira. Em modelos grandes, essa escolha é a diferença entre um relatório fluido e um que trava, tema que tratamos a fundo em analytics avançado.
Exemplos conceituais que cobrem os casos reais
Vou mostrar os padrões que resolvem 90% das demandas. São conceituais, adapte os nomes ao seu modelo.
Top 10 clientes por faturamento, como medida somável:
CALCULATE([Faturamento], TOPN(10, VALUES(Clientes[Nome]), [Faturamento], DESC))
Essa medida devolve a soma do faturamento dos 10 maiores clientes no contexto atual. Coloque num cartão e ela responde a segmentações de ano, região, categoria. É o "top 10" que fecha as contas.
Percentual que os top 5 produtos representam do total:
Você cria a medida do top 5 (como acima, com 5 e produtos) e divide pelo faturamento total sem restrição. O resultado é uma medida de concentração: quanto do faturamento vive nos 5 maiores. É a métrica de Pareto que gestão adora.
Bottom 3 filiais (as piores):
CALCULATE([Faturamento], TOPN(3, VALUES(Filiais[Nome]), [Faturamento], ASC))
Trocar DESC por ASC vira o jogo e traz as menores. Cuidado com filiais de faturamento zero ou nulo, que podem entrar no bottom de forma indesejada. Filtre-as antes se não fizerem sentido no ranking.
Top N com desempate determinístico:
TOPN(5, VALUES(Clientes[Nome]), [Faturamento], DESC, Clientes[ID], ASC)
Aqui a segunda expressão de ordenação (o ID) quebra empates. Se dois clientes têm o mesmo faturamento, o de menor ID ganha a posição. O resultado passa a ser sempre 5 linhas, previsível.
Top N dinâmico ligado a uma segmentação:
Você cria uma tabela desconectada com valores de N (3, 5, 10, 20), captura a seleção com SELECTEDVALUE numa variável e passa essa variável no primeiro argumento do TOPN. O usuário escolhe quantos quer ver. Esse padrão de parâmetro é o mesmo que usamos em soluções de Power BI quando a diretoria quer explorar o ranking sem chamar TI a cada ajuste.
TOPN, VertiPaq e o custo real em capacidade
Decisão de DAX não vive isolada. O Power BI roda sobre o motor VertiPaq, que comprime as colunas segundo a cardinalidade de cada uma. Medidas com TOPN sobre tabelas de baixa cardinalidade (clientes, produtos, filiais) são baratas. O problema aparece quando você aninha TOPN dentro de iteradores pesados ou o aplica sobre granularidade fina.
No Microsoft Fabric, anunciado pela Microsoft em 2023, o consumo é medido em Capacity Units, com SKUs de F2 a F2048. No Premium clássico, os SKUs vão de P1 a P5. Uma medida mal desenhada com TOPN sobre milhões de linhas não fica só lenta: consome CU e impacta outros relatórios que dividem a mesma capacidade. A regra prática é sempre a mesma: alimente TOPN com a tabela na granularidade do ranking, nunca com a fato crua. Se o seu modelo já sofre com performance, o problema raramente é só o TOPN, é a modelagem inteira, e isso é assunto de sustentação de BI.
Perguntas frequentes
TOPN sempre retorna exatamente N linhas?
Não. Retorna N linhas na maioria dos casos, mas quando há empate na posição de corte, TOPN devolve todas as linhas empatadas, o que pode passar de N. Para garantir exatamente N, adicione uma segunda expressão de ordenação com um critério único, como um ID, para desempatar de forma determinística.
Qual a diferença entre TOPN e RANKX?
RANKX devolve o número da posição de cada linha (1, 2, 3) e é ótimo quando você quer exibir o ranking numa coluna. TOPN devolve uma tabela com as N melhores linhas, ideal quando você quer filtrar ou agregar apenas esse grupo dentro de uma medida. Muitas vezes eles se complementam: RANKX para mostrar posição, TOPN para calcular sobre o subconjunto.
Posso usar TOPN direto num cartão de valor?
Não diretamente, porque TOPN devolve uma tabela e o cartão espera um número. Você precisa envolver TOPN com uma função de agregação como CALCULATE ou SUMX. O padrão mais comum é CALCULATE([Medida], TOPN(...)), que recalcula a medida restringindo o modelo às linhas escolhidas.
Como faço um top N que muda conforme o usuário escolhe?
Crie uma tabela de parâmetro com os valores possíveis de N (por exemplo 3, 5, 10, 20), capture a seleção com SELECTEDVALUE numa variável e use essa variável no primeiro argumento do TOPN. Como o primeiro parâmetro aceita expressão, o número de linhas passa a responder à segmentação em tempo real.
Como TOPN se comporta com valores nulos ou zero?
Linhas com valor nulo ou zero na expressão de ordenação participam do ranking normalmente e podem entrar, principalmente num bottom N com ASC. Se elas não fazem sentido no seu ranking, filtre-as antes de aplicar TOPN, envolvendo a tabela de entrada com FILTER para remover os nulos e zeros indesejados.
TOPN prejudica a performance do relatório?
Depende da granularidade da tabela de entrada. Sobre listas de baixa cardinalidade (clientes, produtos) o custo é baixo. Sobre a tabela fato inteira ou dentro de iteradores pesados, o custo cresce e pode consumir capacidade em ambientes Fabric ou Premium. A boa prática é sempre alimentar TOPN com a granularidade exata do ranking.
Fechando: TOPN é controle, não atalho
TOPN não é a versão DAX do botão "mostrar top 10". É uma função de tabela que te dá controle real sobre quais linhas entram num cálculo, com desempate previsível, N dinâmico e resultados que fecham com o total. Usada bem, ela resolve rankings, análises de concentração e a eterna barra "Outros" de forma honesta. Usada no automático, ela vira empate inflado, número que não bate e cartão quebrado.
Se você quer padronizar rankings confiáveis no seu ambiente Power BI, ou desconfia que o problema é a modelagem e não só uma fórmula, fale com a gente. A Fynx já entregou mais de 2.000 soluções Microsoft em 6 anos de mercado, e boa parte do trabalho é transformar "top 10 que não bate" em número que a diretoria confia.
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