Variação entre períodos
Calcule o crescimento mês a mês e as variações dia a dia com LAG.
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 BYe use o deslocamento para a variação ano a ano.
Em seguida: dividir linhas em faixas e níveis com NTILE.
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
- LAG e LEAD para linhas adjacentes
- Variação entre períodos
- NTILE para criação de faixas
- FIRST_VALUE, LAST_VALUE e limites da moldura