0Pricing
SQL Interview Prep · Aula

LAG e LEAD para linhas adjacentes

Acesse os valores da linha anterior e da próxima sem uma autojunção.

LAG e LEAD para linhas adjacentes é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 1 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 SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

A pergunta feita pelos entrevistadores

Uma das perguntas mais comuns em entrevistas para analistas é: "Compare cada linha com a anterior sem uma autojunção." Pense em receita mês a mês, no login anterior de um usuário ou no próximo evento de uma sequência.

A resposta direta são as funções de janela LAG e LEAD. Elas permitem que uma linha consulte o valor de uma linha vizinha, mantendo intactos todos os detalhes de cada linha. Nesta lição, você construirá um modelo mental preciso de como elas navegam pelas linhas adjacentes.

O que LAG e LEAD fazem

LAG(col) retorna o valor de col da linha anterior. LEAD(col) retorna o valor da linha seguinte. "Anterior" e "seguinte" são definidos inteiramente pelo ORDER BY dentro da cláusula OVER.

  • LAG olha para trás.
  • LEAD olha para frente.

Ambas são funções de janela de deslocamento: elas nunca reduzem o número de linhas; apenas anexam o valor de uma linha vizinha à linha atual.

Sintaxe básica de LAG

Esta é a estrutura canônica. Temos uma tabela sales com month e revenue. Queremos que cada linha também mostre a receita do mês anterior.

O OVER (ORDER BY month) informa ao mecanismo como definir "anterior". A primeira linha não tem uma predecessora, portanto prev_revenue é NULL nessa linha.

SELECT
  month,
  revenue,
  LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;

Lendo o resultado

Para os dados 2024-01 = 100, 2024-02 = 130 e 2024-03 = 120, a consulta retorna:

  • Jan: receita 100, prev_revenue NULL
  • Fev: receita 130, prev_revenue 100
  • Mar: receita 120, prev_revenue 130

Cada linha obteve o valor da linha imediatamente acima no conjunto ordenado. Sem autojunção, sem subconsulta e sem perda de linhas.

LEAD olha para frente

LEAD é o inverso. Use-o quando uma linha precisar saber o que vem a seguir, por exemplo, a data da próxima compra para calcular o tempo entre pedidos.

A última linha do conjunto ordenado não tem uma sucessora, portanto o resultado de LEAD é NULL.

SELECT
  month,
  revenue,
  LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;

O argumento de deslocamento

Ambas as funções aceitam um segundo argumento opcional: quantas linhas devem ser puladas. LAG(col, 2) recua duas linhas, e LEAD(col, 3) avança três linhas.

Os entrevistadores usam isso para pedir, por exemplo, a "receita de dois meses atrás" ou "o valor três linhas abaixo". O deslocamento padrão é 1.

SELECT
  month,
  revenue,
  LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;

O argumento de valor padrão

Um terceiro argumento fornece um valor substituto quando não há uma linha vizinha, em vez de obter NULL. A assinatura é LAG(col, offset, default).

Isso é útil quando um cálculo posterior não pode aceitar NULL, por exemplo, tratando o valor anterior ausente como 0 para que uma diferença ainda possa ser calculada.

SELECT
  month,
  revenue,
  LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;

PARTITION BY reinicia a janela

Dados reais raramente têm uma única série global. Normalmente, você compara dados dentro de cada cliente, produto ou região. PARTITION BY reinicia o cálculo de LAG/LEAD no início de cada partição.

Isso significa que a primeira linha de cada partição recebe NULL de LAG, sem transferir um valor através do limite para os dados de outro cliente.

SELECT
  customer_id,
  order_date,
  amount,
  LAG(amount) OVER (
    PARTITION BY customer_id
    ORDER BY order_date
  ) AS prev_amount
FROM orders;

Exemplo resolvido: dias entre pedidos

Uma tarefa frequente é medir o intervalo entre os pedidos consecutivos de um cliente. Obtenha a data do pedido anterior com LAG e depois faça a subtração.

O primeiro pedido de cada cliente resulta em NULL, pois não há uma data anterior para subtrair. Esse é exatamente o tipo de comparação por cliente que os entrevistadores esperam que as funções de janela resolvam.

SELECT
  customer_id,
  order_date,
  order_date - LAG(order_date) OVER (
    PARTITION BY customer_id
    ORDER BY order_date
  ) AS days_since_prev
FROM orders;

Por que não usar uma autojunção?

A solução anterior às funções de janela era uma autojunção correlacionada: juntar a tabela a ela mesma pela "linha cuja data é a maior abaixo desta". Ela funciona, mas é prolixa, sujeita a erros com empates e muitas vezes mais lenta.

  • LAG/LEAD expressam a intenção em uma linha.
  • São avaliadas em uma única passagem ordenada.
  • Os empates são resolvidos de forma determinística pelo seu ORDER BY.

Dizer "Eu usaria LAG em vez de uma autojunção" demonstra domínio do assunto.

Armadilha comum: ausência de ORDER BY

Sem um ORDER BY na cláusula OVER, a "linha anterior" não é definida. Alguns mecanismos rejeitam a consulta; outros retornam resultados imprevisíveis. Sempre defina a ordenação da janela.

Lembre-se também de que a ordenação dentro de OVER é independente do ORDER BY externo da consulta. A janela decide qual linha é a vizinha; a cláusula externa decide apenas a ordem de exibição.

Verificação rápida

Teste sua compreensão das funções de janela de deslocamento.

Recapitulação

Agora você conhece as funções de janela de deslocamento:

  • LAG(col) lê a linha anterior, e LEAD(col) lê a próxima, conforme definido pelo ORDER BY da janela.
  • Argumentos opcionais: LAG(col, offset, default).
  • PARTITION BY reinicia a navegação para cada grupo, portanto as linhas de limite são NULL.
  • Elas substituem autojunções complicadas para comparar linhas adjacentes.

Em seguida, aplicaremos isso à pergunta garantida para analistas: variação entre períodos.

Perguntas Frequentes

A aula “LAG e LEAD para linhas adjacentes” é grátis?

Sim — o texto completo de “LAG e LEAD para linhas adjacentes” é 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 SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “LAG e LEAD para linhas adjacentes”?

Acesse os valores da linha anterior e da próxima sem uma autojunção. Você pratica SQL 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 SQL Interview Prep?

Nenhuma experiência prévia é necessária. SQL 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 1 de 4.

Quanto tempo leva a aula “LAG e LEAD para linhas adjacentes”?

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 SQL Interview Prep?

Sim. Cada aula de SQL 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 SQL Interview Prep