Coding Interview Prep · Aula

Variação entre períodos

Calcule o crescimento mês a mês e as variações dia a dia com LAG.

Aula 2 de 413 etapas

Variação entre períodos é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.

A pergunta inevitável para analistas

Se você participar de uma entrevista para uma vaga de analista de dados, espere perguntas como: "Calcule o crescimento mês a mês" ou "Qual é a variação dia a dia?" É quase inevitável.

O componente básico é LAG: obtenha o valor do período anterior e depois calcule uma diferença absoluta ou uma variação percentual. Esta lição transforma LAG nos padrões de variação entre períodos que os entrevistadores avaliam.

Variação absoluta com LAG

A versão mais simples é a diferença bruta entre este período e o anterior. Obtenha o valor anterior com LAG e faça a subtração diretamente.

A primeira linha ordenada não tem uma linha anterior, portanto sua variação é NULL. Isso está correto, não é um erro: de fato, não existe um período anterior para comparação.

SELECT
  month,
  revenue,
  revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;

Variação percentual

Os entrevistadores geralmente querem o crescimento em porcentagem. A fórmula é (atual - anterior) / anterior, multiplicada por 100. Expresse-a diretamente com LAG.

Preste atenção à ordem das operações e aos parênteses; um parêntese mal colocado é um erro clássico sob pressão.

SELECT
  month,
  revenue,
  100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
        / LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;

Evite a divisão inteira

Uma armadilha em que muitos candidatos caem: se revenue for um número inteiro, (110 - 100) / 100 será avaliado como 0 nos bancos de dados que fazem divisão inteira.

Multiplique por 100.0 (um literal de ponto flutuante) ou use CAST para converter primeiro para um número decimal e forçar a aritmética de ponto flutuante. Mencionar isso proativamente demonstra atenção aos detalhes.

SELECT
  month,
  ROUND(
    100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
          / LAG(revenue) OVER (ORDER BY month), 2
  ) AS pct_growth
FROM monthly_sales;

Mais limpo: calcule uma vez em uma CTE

Chamar LAG duas vezes (numerador e denominador) é repetitivo e facilita a ocorrência de erros de digitação. Uma refatoração comum é calcular o valor anterior uma vez em uma CTE e depois fazer a aritmética na consulta externa.

Isso fica mais claro em uma entrevista com quadro branco e evita divergências entre as duas chamadas de LAG.

WITH t AS (
  SELECT
    month,
    revenue,
    LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
)
SELECT
  month,
  revenue,
  ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;

Evite a divisão por zero

Se o valor do período anterior puder ser 0, a fórmula percentual fará uma divisão por zero e gerará um erro. Use NULLIF(prev, 0) para que o denominador se torne NULL e o resultado seja NULL, em vez de ocorrer uma exceção.

A divisão defensiva é um pequeno detalhe que os entrevistadores percebem em candidatos atentos às necessidades de produção.

SELECT
  month,
  revenue,
  100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
  SELECT month, revenue,
         LAG(revenue) OVER (ORDER BY month) AS prev
  FROM monthly_sales
) s;

Variação entre períodos por grupo

A maioria das perguntas reais tem escopo: crescimento mês a mês por produto ou por região. Adicione PARTITION BY para que a série de cada grupo seja comparada apenas consigo mesma.

O mês mais antigo de cada grupo é reiniciado como NULL, sem nunca fazer uma comparação entre limites de produtos.

SELECT
  product_id,
  month,
  revenue,
  revenue - LAG(revenue) OVER (
    PARTITION BY product_id
    ORDER BY month
  ) AS mom_change
FROM product_sales;

Variação ano a ano com deslocamento

Para calcular a variação ano a ano em dados mensais nos quais as linhas estão separadas por um mês, compare com o valor de 12 linhas anteriores. O argumento de deslocamento faz isso diretamente: LAG(revenue, 12).

Isso pressupõe uma linha por mês, sem lacunas. Se alguns meses puderem estar ausentes, você deverá fazer a junção usando uma data explícita, uma sutileza que vale a pena mencionar em voz alta.

SELECT
  month,
  revenue,
  revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;

Pré-agregue antes de comparar

As tabelas brutas de eventos não vêm pré-totalizadas por mês. Uma resposta realista primeiro agrega os dados para obter uma linha por período e depois aplica LAG ao resultado agregado, geralmente por meio de uma CTE.

Aplicar LAG a linhas não agregadas compara transações individuais, não totais mensais: um erro lógico comum.

WITH monthly AS (
  SELECT DATE_TRUNC('month', order_date) AS mth,
         SUM(amount) AS revenue
  FROM orders
  GROUP BY 1
)
SELECT mth, revenue,
       revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;

Interpretando o primeiro NULL

Às vezes os entrevistadores perguntam: "Por que o crescimento da primeira linha é NULL e isso é aceitável?" A resposta correta é: não há um período anterior, portanto a variação não é definida, e NULL representa isso corretamente.

Se o negócio quiser 0 no lugar disso, você poderá usar LAG(revenue, 1, 0) ou COALESCE, mas somente se isso corresponder ao significado pretendido.

Rotulando a direção do crescimento

Às vezes os entrevistadores ampliam a pergunta: "Indique também se cada mês cresceu, diminuiu ou permaneceu estável." Envolva a comparação com LAG em uma expressão CASE.

A comparação com o valor anterior produz uma coluna de tendência clara e legível, além da diferença numérica, e exibe adequadamente NULL ou um rótulo padrão para o primeiro período, que não tem comparação.

SELECT
  month,
  revenue,
  CASE
    WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
    WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
    ELSE 'flat'
  END AS trend
FROM monthly_sales
ORDER BY month;

Verificação rápida

Identifique o erro comum em consultas de variação percentual.

Recapitulação

A variação entre períodos é LAG mais aritmética:

  • Variação absoluta: value - LAG(value) OVER (ORDER BY period).
  • Variação percentual: 100.0 * (value - prev) / NULLIF(prev, 0).
  • Force a aritmética de ponto flutuante, evite a divisão por zero e pré-agregue os dados para obter uma linha por período.
  • Delimite o escopo com PARTITION BY e use o deslocamento para a variação ano a ano.

Em seguida: dividir linhas em faixas e níveis com NTILE.

Grátis para começar

Aprenda Coding Interview Prep com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
90
Aulas
360

Perguntas Frequentes

A aula “Variação entre períodos” é grátis?

Sim — o texto completo de “Variação entre períodos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.

O que vou aprender em “Variação entre períodos”?

Calcule o crescimento mês a mês e as variações dia a dia com LAG. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Variação entre períodos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Coding Interview Prep?

Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. LAG e LEAD para linhas adjacentes
  2. Variação entre períodos
  3. NTILE para criação de faixas
  4. FIRST_VALUE, LAST_VALUE e limites da moldura
← Voltar para Coding Interview Prep