FIRST_VALUE, LAST_VALUE e limites da moldura
Extraia valores de limite e conheça a armadilha da moldura de LAST_VALUE.
FIRST_VALUE, LAST_VALUE e limites da moldura é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 4 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.
Obtendo valores de limite
Os entrevistadores perguntam: "Mostre cada linha junto com o primeiro e o último valor do seu grupo." Pense na primeira data de acesso por usuário ou no preço mais recente de uma partição ao lado de cada linha de detalhe.
As funções são FIRST_VALUE e LAST_VALUE. Elas parecem simples, mas LAST_VALUE esconde uma das armadilhas mais famosas das molduras de janela em SQL. Esta lição torna ambas confiáveis.
Noções básicas de FIRST_VALUE
FIRST_VALUE(col) retorna o valor de col da primeira linha da janela, associado a todas as linhas. Ordenada por data, ela fornece a cada linha o valor mais antigo da sua partição.
Como a moldura padrão começa na primeira linha da partição, FIRST_VALUE geralmente se comporta exatamente como as pessoas esperam.
SELECT
user_id,
login_date,
FIRST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
) AS first_login
FROM logins;A moldura de janela padrão
Aqui está o ponto central. Quando você adiciona ORDER BY a uma janela, a moldura padrão é RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
Isso significa que a janela de cada linha se estende apenas do início da partição até a linha atual, e não até o fim. FIRST_VALUE não é afetado (a primeira linha está sempre no intervalo), mas LAST_VALUE é fortemente afetado.
A armadilha de LAST_VALUE
Execute LAST_VALUE usando apenas um ORDER BY e a maioria dos candidatos espera o valor final da partição. Em vez disso, como a moldura termina na linha atual, o "último valor na moldura" é apenas o próprio valor da linha atual.
Assim, esta consulta retorna o próprio login_date em todas as linhas, o que parece estar errado. Esta é a armadilha sobre funções de janela que aparece com mais frequência.
SELECT
user_id,
login_date,
LAST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
) AS wrong_last_login
FROM logins;Corrigindo LAST_VALUE com uma moldura completa
A solução é ampliar a moldura para abranger toda a partição: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
Agora a janela de cada linha abrange a partição inteira, portanto LAST_VALUE retorna o verdadeiro valor final. Mencione explicitamente essa solução em uma entrevista; isso prova que você entende as molduras, e não apenas os nomes das funções.
SELECT
user_id,
login_date,
LAST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
) AS last_login
FROM logins;Uma alternativa mais simples
Muitos engenheiros contornam completamente a moldura: para obter o último valor, usam FIRST_VALUE com a ordem de classificação invertida.
FIRST_VALUE(login_date) OVER (... ORDER BY login_date DESC) retorna a data mais recente sem precisar de uma cláusula de moldura. É um truque simples e fácil de memorizar para mencionar.
SELECT
user_id,
login_date,
FIRST_VALUE(login_date) OVER (
PARTITION BY user_id
ORDER BY login_date DESC
) AS last_login
FROM logins;ROWS versus RANGE em molduras
Há dois tipos de moldura. ROWS conta linhas físicas; RANGE agrupa por valores iguais de ORDER BY (pares).
A moldura padrão usa RANGE, por isso valores empatados de ORDER BY compartilham um limite de moldura. Para corrigir LAST_VALUE, prefira a forma explícita ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING para evitar surpresas com empates.
NTH_VALUE para posições arbitrárias
Além do primeiro e do último, NTH_VALUE(col, n) obtém o valor na posição n dentro da moldura, por exemplo, o segundo maior preço.
Ele segue as mesmas regras de moldura que LAST_VALUE, portanto combine-o com uma moldura completa quando quiser o enésimo valor em toda a partição, e não apenas até a linha atual.
SELECT
product_id,
price,
NTH_VALUE(price, 2) OVER (
PARTITION BY product_id
ORDER BY price DESC
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
) AS second_highest_price
FROM prices;Exemplo prático: primeiro e último juntos
Um relatório comum mostra cada transação ao lado do valor da primeira e da última transação do cliente. Combine as duas funções, lembrando-se da moldura explícita para LAST_VALUE.
Agora cada linha contém o primeiro e o último valores da partição inteira, prontos para uma variação ou uma etapa de rotulagem.
SELECT
customer_id,
txn_date,
amount,
FIRST_VALUE(amount) OVER w AS first_amt,
LAST_VALUE(amount) OVER w AS last_amt
FROM transactions
WINDOW w AS (
PARTITION BY customer_id
ORDER BY txn_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
);Janelas nomeadas mantêm o código DRY
Observe que a consulta anterior usou uma cláusula WINDOW w AS (...) e referenciou OVER w duas vezes. Definir a janela uma única vez evita repetir uma especificação longa de moldura e impede que as duas funções divirjam.
A maioria dos principais bancos de dados oferece suporte a janelas nomeadas. Usar uma é um detalhe elegante que os entrevistadores apreciam quando várias colunas compartilham uma janela.
Exemplo prático: variação do primeiro ao último
Uma pergunta de acompanhamento frequente é sobre a mudança da primeira para a última transação de um cliente. Com os dois valores de limite em cada linha, subtraia um do outro e, se necessário, elimine as duplicidades para obter uma linha por cliente.
Isso combina a solução da moldura completa com uma aritmética simples: exatamente o tipo de resposta completa, de ponta a ponta, que os entrevistadores querem ver montada de forma organizada.
SELECT DISTINCT
customer_id,
LAST_VALUE(amount) OVER w - FIRST_VALUE(amount) OVER w AS first_to_last_delta
FROM transactions
WINDOW w AS (
PARTITION BY customer_id
ORDER BY txn_date
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
);Verificação rápida
A armadilha clássica de LAST_VALUE.
Recapitulação
As funções de valores de limite dependem da moldura:
FIRST_VALUEfunciona com a moldura padrão;LAST_VALUEnão funciona.- A moldura padrão termina na linha atual, portanto corrija
LAST_VALUEcomROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWINGou inverta a ordem de classificação e useFIRST_VALUE. NTH_VALUE(col, n)obtém posições arbitrárias; janelas nomeadas mantêm DRY as especificações de várias colunas.
Isso conclui o conjunto de ferramentas de LAG, LEAD, NTILE e valores de limite.
Perguntas Frequentes
A aula “FIRST_VALUE, LAST_VALUE e limites da moldura” é grátis?
Sim — o texto completo de “FIRST_VALUE, LAST_VALUE e limites da moldura” é 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 “FIRST_VALUE, LAST_VALUE e limites da moldura”?
Extraia valores de limite e conheça a armadilha da moldura de LAST_VALUE. 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 4 de 4.
Quanto tempo leva a aula “FIRST_VALUE, LAST_VALUE e limites da moldura”?
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