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 Coding 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 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 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/LEADexpressam 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, eLEAD(col)lê a próxima, conforme definido peloORDER BYda janela.- Argumentos opcionais:
LAG(col, offset, default). PARTITION BYreinicia a navegação para cada grupo, portanto as linhas de limite sãoNULL.- 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding 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 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 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 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