Pular para o conteúdo
Fynx
Business Intelligence12 min de leitura

EARLIER e variáveis em DAX: o que faz e quando usar (com exemplos)

EARLIER e variáveis DAX na prática: o que a função EARLIER faz, o exemplo clássico de ranking em coluna calculada e por que VAR deixa o código legível.

F
Fynx

Se a sua coluna de ranking em DAX parece mágica, o problema é o contexto de linha

Toda vez que alguém abre um modelo antigo e encontra uma coluna calculada cheia de EARLIER, a reação é sempre a mesma: uma pausa longa tentando decifrar de qual linha aquele valor está falando. Entender EARLIER e variáveis DAX é entender exatamente isso, ou seja, como o DAX enxerga a linha que está sendo calculada e a linha que ele está percorrendo por dentro de um FILTER. Sem esse conceito, ranking, acumulado e comparação dentro de grupo viram tentativa e erro, e a fórmula que funciona no seu teste falha no relatório do usuário.

Neste artigo eu vou direto ao ponto. Você vai ver o que a função EARLIER realmente faz, o exemplo clássico de ranking em coluna calculada que consagrou essa função, e por que hoje as variáveis com VAR fazem o mesmo trabalho com metade da confusão. Se você ainda está construindo base, vale ler antes o nosso guia de boas práticas de modelagem e DAX, porque aqui eu assumo que você já sabe a diferença entre uma medida e uma coluna calculada.

EARLIER acessa o valor de uma linha externa, nada mais que isso

A definição técnica é curta: EARLIER retorna o valor de uma coluna no contexto de linha anterior, ou seja, o contexto que estava valendo antes de o DAX entrar em uma iteração aninhada. Ela recebe a coluna que você quer ler e, opcionalmente, um número que indica quantos níveis subir.

Para entender isso, precisa aceitar uma ideia. Em uma coluna calculada, o DAX percorre a tabela linha a linha. Esse é o contexto de linha. Quando, dentro dessa coluna, você chama uma função iteradora como FILTER, o DAX abre um segundo contexto de linha, uma varredura dentro da varredura. Nesse ponto existem duas linhas ativas ao mesmo tempo: a linha de dentro, que o FILTER está avaliando, e a linha de fora, aquela em que a coluna começou a ser calculada. EARLIER é o que te dá acesso a essa linha de fora.

O nome confunde muita gente, porque "earlier" sugere tempo, algo cronológico. Não tem nada a ver com data nem com linha anterior da tabela. A palavra se refere ao contexto de linha que veio antes na ordem de aninhamento do cálculo. É um conceito de escopo, não de calendário, e guardar isso já evita metade dos erros que eu vejo por aí.

Alguns detalhes práticos que valem a pena registrar:

  • EARLIER( Tabela[Coluna] ) sobe um nível, o mais comum.
  • EARLIER( Tabela[Coluna], 2 ) sobe dois níveis, útil quando há iteração dentro de iteração dentro de iteração.
  • EARLIEST( Tabela[Coluna] ) vai direto ao contexto de linha mais externo, sem contar os níveis.
  • Fora de um contexto de linha aninhado, EARLIER não tem o que retornar e gera erro.

O exemplo clássico de ranking com EARLIER

O caso que tornou EARLIER famoso é o ranking em coluna calculada. Imagine uma tabela Vendas e você quer, em cada linha, a posição daquela venda em relação a todas as outras, da maior para a menor. A lógica é simples de descrever: conte quantas vendas têm valor maior que a venda atual e some um.

O problema é que, dentro do FILTER, quando você escreve Vendas[Valor], o DAX passa a ler o valor da linha que o FILTER está percorrendo, não a linha original que você quer ranquear. Você precisa de um jeito de dizer "compare com o valor da linha de fora". É aí que entra EARLIER:

Ranking Vendas =
COUNTROWS (
    FILTER (
        Vendas,
        Vendas[Valor] > EARLIER ( Vendas[Valor] )
    )
) + 1

Leia devagar. O FILTER percorre a tabela Vendas inteira. Para cada linha dessa varredura, ele compara Vendas[Valor], o valor da linha interna, com EARLIER( Vendas[Valor] ), o valor da linha externa, aquela que a coluna calculada está preenchendo naquele momento. O FILTER devolve só as linhas com valor maior, COUNTROWS conta quantas são e somamos um para virar posição. A maior venda tem zero acima dela, logo fica em primeiro lugar.

Funciona, é elegante no papel, e por anos foi a resposta canônica. Mas repare no incômodo: para saber o que EARLIER significa, você precisa reconstruir mentalmente qual varredura está por fora. Em uma fórmula com três iterações aninhadas e EARLIER( coluna, 2 ) no meio, a leitura vira um exercício de paciência. Esse é o custo escondido dessa função.

EARLIER e variáveis DAX resolvem o mesmo problema por caminhos diferentes

Aqui está a virada. Desde que a Microsoft trouxe as variáveis para o DAX, existe uma forma mais limpa de fazer a mesma coisa. Uma variável declarada com VAR captura o valor no contexto em que ela é avaliada, e esse valor fica congelado, com nome, disponível para o resto da fórmula. Ou seja, você guarda o valor da linha externa em uma variável antes de entrar no FILTER, e lá dentro usa o nome da variável em vez de EARLIER.

O mesmo ranking, reescrito com VAR e RETURN, fica assim:

Ranking Vendas =
VAR ValorAtual = Vendas[Valor]
RETURN
    COUNTROWS (
        FILTER (
            Vendas,
            Vendas[Valor] > ValorAtual
        )
    ) + 1

A diferença de leitura é enorme. ValorAtual é declarado fora do FILTER, então ele guarda o valor da linha que está sendo calculada, exatamente o que EARLIER fazia, só que com um nome que qualquer pessoa entende. Dentro do FILTER, a comparação Vendas[Valor] > ValorAtual se lê quase como português: o valor da linha percorrida contra o valor atual. Ninguém precisa mais pensar em níveis de aninhamento. O nome da variável faz o trabalho que o contexto fazia implicitamente.

É por isso que hoje, na maioria dos cenários, VAR substitui EARLIER. Não é modismo. A variável elimina a ambiguidade do "qual contexto de linha é este" transformando um conceito abstrato em um nome concreto que você escolhe. E como bônus, se você precisar do mesmo valor duas ou três vezes na fórmula, a variável é avaliada uma vez só e reutilizada, enquanto EARLIER seria reavaliado a cada aparição.

Vale um resumo lado a lado das duas abordagens:

AspectoCom EARLIERCom VAR
Como acessa a linha externaSobe no contexto de linha aninhadoCaptura o valor antes de aninhar
LegibilidadeExige rastrear o aninhamentoNome explícito escolhido por você
Reuso do valor na fórmulaReavalia a cada usoAvalia uma vez, reutiliza
Curva de aprendizadoAlta, conceito de contextoBaixa, parece variável comum
Recomendação atualLegado e casos específicosPadrão para quase tudo

Ranking dentro de um grupo mostra a diferença com clareza

O ranking simples é bom para explicar, mas o valor real aparece quando o problema fica mais denso. Suponha uma tabela Produtos com as colunas Categoria e Faturamento, e você quer o ranking de cada produto dentro da sua própria categoria, não no geral. Agora são duas comparações: mesma categoria e faturamento maior.

Com EARLIER, a fórmula precisa de duas chamadas, uma para cada coluna da linha externa:

Ranking na Categoria =
COUNTROWS (
    FILTER (
        Produtos,
        Produtos[Categoria] = EARLIER ( Produtos[Categoria] )
            && Produtos[Faturamento] > EARLIER ( Produtos[Faturamento] )
    )
) + 1

Repare que já são dois EARLIER na mesma expressão, cada um apontando para uma coluna da linha de fora. Não está errado, mas a densidade sobe, e quem chega depois precisa confirmar que os dois falam da mesma linha externa. Com VAR, a intenção fica escancarada:

Ranking na Categoria =
VAR CategoriaAtual = Produtos[Categoria]
VAR FaturamentoAtual = Produtos[Faturamento]
RETURN
    COUNTROWS (
        FILTER (
            Produtos,
            Produtos[Categoria] = CategoriaAtual
                && Produtos[Faturamento] > FaturamentoAtual
        )
    ) + 1

Duas variáveis com nomes honestos no topo, e o FILTER lê como uma frase: "mesma categoria e faturamento maior que o do produto atual". Esse é o tipo de código que sobrevive a trocas de time e a revisões seis meses depois, que é onde a legibilidade deixa de ser estética e vira dinheiro em sustentação de BI.

Quando ainda faz sentido conhecer EARLIER

Ser honesto aqui é obrigação. VAR não apaga EARLIER, e dizer que a função morreu seria exagero. Há três motivos concretos para continuar entendendo essa função de cabeça.

O primeiro é manutenção de legado. Modelos com anos de estrada estão cheios de EARLIER, e você vai precisar ler e ajustar essas fórmulas sem quebrar nada. Não dá para refatorar com segurança o que você não entende.

O segundo é o raciocínio sobre contexto de linha em si. EARLIER obriga você a pensar em aninhamento de iterações, e esse é um músculo que serve para muito além dessa função. Quem domina o conceito escreve SUMX, AVERAGEX e RANKX com mais segurança.

O terceiro é que colunas calculadas continuam sendo o território natural desse tipo de cálculo. Ranking, acumulado e comparação linha a linha frequentemente vivem melhor como coluna calculada, materializada no modelo, do que como medida recalculada a cada visual. Só cuidado para não exagerar: coluna calculada ocupa memória e infla o modelo. A regra prática está abaixo.

SituaçãoPrefiraPor quê
Escrever ranking ou acumulado hojeVAR e RETURNCódigo legível e fácil de manter
Ler ou corrigir modelo legadoEntender EARLIERVocê não pode refatorar o que não entende
Aninhamento de três ou mais iteraçõesVAR por nívelCada valor ganha um nome claro
Ranking que vai virar medida dinâmicaRANKX em vez de FILTERFunção dedicada, respeita contexto de filtro
Valor usado várias vezes na fórmulaVARAvalia uma vez e reutiliza

Um adendo para quem pensa em ranking como medida, e não como coluna: se o objetivo é um ranking que reage a segmentações e filtros da página, nem EARLIER nem uma variável dentro de FILTER são o caminho ideal. A função RANKX foi feita para isso e lida melhor com contexto de filtro. EARLIER e a dupla VAR mais FILTER brilham na coluna calculada, onde o grão é fixo e materializado. Escolher a ferramenta certa para o nível certo é metade do trabalho de analytics avançado bem feito.

O que muda no dia a dia de quem escreve DAX

Na prática, a orientação que a gente passa nos projetos de Power BI da Fynx é simples: escreva com VAR. Sempre que for capturar o valor de uma linha para comparar dentro de uma iteração, declare uma variável com um nome que descreva o valor, e use esse nome. O código nasce legível e a próxima pessoa não precisa ser especialista em contexto de linha para entender o que você quis dizer.

EARLIER entra na sua vida em dois momentos: quando você lê código antigo e quando quer, de propósito, treinar o raciocínio de aninhamento. Fora isso, é conhecimento de fundo, não ferramenta de primeira escolha. Se sobrar dúvida sobre qual usar em um caso concreto, faça a pergunta que resolve quase tudo: alguém que não escreveu esta fórmula entenderia de primeira? Se a resposta passar por "depende de qual contexto de linha", troque por VAR.

Perguntas frequentes

O que a função EARLIER faz em DAX? EARLIER retorna o valor de uma coluna no contexto de linha externo, ou seja, o contexto que estava ativo antes de o cálculo entrar em uma iteração aninhada, como um FILTER dentro de uma coluna calculada. Ela serve para comparar a linha que está sendo percorrida com a linha original que você quer calcular. O nome não tem relação com tempo nem com ordem cronológica das linhas.

EARLIER é a mesma coisa que a linha anterior da tabela? Não, e essa é a confusão mais comum. EARLIER não acessa a linha de cima na tabela nem a data anterior. Ela acessa o contexto de linha que veio antes na ordem de aninhamento do cálculo. É um conceito de escopo entre iterações, não de posição ou de calendário. Se você quer o valor de uma data anterior, o caminho é outro, com funções de inteligência de tempo.

Por que VAR substitui EARLIER na maioria dos casos? Porque uma variável captura o valor no contexto atual e guarda esse valor com um nome que você escolhe. Dentro da iteração, você usa o nome em vez de EARLIER, o que elimina a ambiguidade sobre qual contexto de linha está sendo lido. O código fica mais legível, mais fácil de manter e a variável ainda é avaliada uma única vez, mesmo que você a use várias vezes na fórmula.

Ainda preciso aprender EARLIER se vou usar VAR? Sim, por dois motivos práticos. Você vai encontrar EARLIER em modelos legados que precisam de manutenção, e não dá para refatorar com segurança o que você não entende. Além disso, entender EARLIER obriga a dominar contexto de linha aninhado, um conceito que serve para escrever SUMX, AVERAGEX e RANKX com mais segurança. É conhecimento de fundo que vale ter.

Posso trocar EARLIER por VAR direto em um modelo antigo? Pode, mas com cuidado. Antes de trocar, confirme qual contexto de linha aquele EARLIER estava acessando, principalmente se houver o segundo argumento numérico indicando mais de um nível para fora. Declare a variável no ponto certo e teste o resultado antes e depois. Refatorar às cegas introduz bug em produção.

Para fazer ranking, uso EARLIER, VAR ou RANKX? Depende do nível. Para ranking em coluna calculada, com grão fixo e materializado, VAR com FILTER é a forma moderna e legível, e EARLIER é a versão antiga do mesmo padrão. Para um ranking em medida, que reage a filtros e segmentações da página, use RANKX, que foi desenhada para lidar com contexto de filtro. Escolher o nível certo evita fórmula que funciona no teste e falha no relatório.

Fechando

EARLIER não é difícil, é apenas de uma era anterior. O conceito que ela ensina, o contexto de linha aninhado, continua valendo e vale a pena dominar. A ferramenta para escrever no dia a dia, porém, mudou: variáveis com VAR fazem o mesmo trabalho com nomes claros, avaliação única e código legível. Aprenda EARLIER para ler o passado e escreva com VAR para construir o presente.

Se o seu modelo já está cheio de fórmulas que ninguém consegue mais ler, isso costuma ser sintoma de dívida técnica em DAX, e é o tipo de coisa que a gente destrava rápido. Fale com a gente e mostramos como deixar o seu Power BI legível e previsível de novo.

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.