Voltar para a lista de artigos Artigos
9 minutos de leitura

Função SQL FIRST_VALUE

Descubra o poder da função FIRST_VALUE, uma função de janela que retorna o primeiro valor em uma partição ordenada do conjunto de resultados. Essa função é útil para qualquer pessoa que faça análise de dados em SQL.

As funções de janela são uma categoria poderosa de funções que permitem fazer análises sofisticadas de dados em SQL. Essas funções operam em uma "janela" de linhas relacionadas à linha atual, permitindo a preparação de relatórios complexos, como totais em execução, médias móveis, preparação de classificações e outros. Uma das funções de janela comuns é a função FIRST_VALUE.

A função FIRST_VALUE retorna o primeiro valor em uma partição ordenada de um conjunto de resultados. A função pode ser útil em cenários em que você compara um valor atual com o primeiro valor em um determinado conjunto:

  • a alteração nos preços das ações desde o preço da primeira emissão até o preço atual, fornecendo uma visão do desempenho de uma ação desde sua estreia.
  • a alteração no preço do produto, desde o preço do primeiro lançamento até o preço atual, para analisar as flutuações de preço ou o nível de desconto do preço original.
  • a alteração nos primeiros sinais vitais registrados (como pressão arterial ou nível de glicose) de um paciente ao dar entrada no hospital pela primeira vez, em comparação com as leituras posteriores.
  • comparar a temperatura atual com a primeira temperatura registrada nesta data ou neste ano, por exemplo, para estudar mudanças climáticas ou padrões meteorológicos.

A função FIRST_VALUE é a contraparte dupla de outra função de janela SQL, LAST_VALUE. FIRST_VALUE retorna o primeiro valor em um conjunto de dados, enquanto LAST_VALUE retorna o último valor em um conjunto de dados.

Se você quiser aprender sobre funções de janela, recomendo nosso curso interativo Funções de Janela (Window Functions) em SQL. Esse curso é excelente para quem deseja aprender as funções de janela do SQL e usá-las para trabalhar com dados de forma mais eficaz. O curso contém mais de 200 exercícios interativos para ajudá-lo a adquirir confiança em suas habilidades.

Como usar a função FIRST_VALUE

A função FIRST_VALUE retorna o primeiro valor de uma expressão em um conjunto ordenado por outra expressão. A sintaxe de FIRST_VALUE é simples:

FIRST_VALUE(expression) OVER (
	[PARTITION BY column_1, column_2, ...]
	ORDER BY expression2
	[ROWS BETWEEN range_start AND range_end]
)
  • expression - a coluna ou expressão da qual você deseja recuperar o primeiro valor.
  • ORDER BY - define a ordenação das linhas de dados em cada partição. O site FIRST_VALUE a utiliza para identificar a primeira linha da qual obterá o valor.
  • PARTITION BY - opcional; divide o conjunto de resultados em partições às quais a função FIRST_VALUE é aplicada independentemente. Se PARTITION BY for omitido, a função tratará todo o conjunto de resultados como uma única partição.
  • ROWS BETWEEN - opcional; define o quadro da janela, ou seja, o conjunto de linhas em cada partição em relação à linha atual.

Demonstramos o FIRST_VALUE por meio de exemplos usando uma tabela stock_quotes. A tabela contém preços de ações de diferentes empresas (símbolos) em diferentes datas e horários. A tabela tem as seguintes colunas:

  • id (integer) - Um identificador exclusivo para cada registro.
  • symbol (text) - O símbolo da ação.
  • quote_date (timestamp) - A data e a hora da cotação da ação.
  • price (decimal) - O preço da ação naquela data.

Aqui estão alguns exemplos de linhas da tabela (com dados fictícios):

idsymbolquote_dateprice
1AAPL2023-04-01 9:00150
2AAPL2023-04-02 9:05148
3MSFT2023-04-01 9:00250
4MSFT2023-04-02 9:05255
5GOOGL2023-04-01 9:001200
6GOOGL2023-04-02 9:051210

Exemplo 1: Uso simples de FIRST_VALUE - o primeiro preço de uma determinada empresa

Este é o uso mais simples da função FIRST_VALUE: queremos encontrar o primeiro preço registrado para uma determinada empresa, como a Apple Inc. (AAPL). Podemos usar a seguinte consulta SQL:

 SELECT
  quote_date,
  price,
  FIRST_VALUE(price) OVER (ORDER BY quote_date) AS first_price
 FROM stock_quotes
 WHERE symbol = 'AAPL';

Essa consulta seleciona apenas os preços das ações da Apple Inc. (símbolo AAPL). Ela seleciona a data da cotação e o preço nessa data. Ela usa a função FIRST_VALUE para selecionar o primeiro preço registrado para a empresa. Todos os preços das ações da Apple são classificados com OVER (ORDER BY quote_date). A função FIRST_VALUE retorna o preço da primeira linha nessa classificação, ou seja, o primeiro preço já registrado para a Apple.

Exemplo 2: FIRST_VALUE com PARTITION BY - Primeiro preço de todos os símbolos

Normalmente, você usa FIRST_VALUE com PARTITION BY. Dessa forma, a função FIRST_VALUE é aplicada separadamente em cada partição definida por PARTITION BY. Suponha que você precise encontrar o primeiro preço de cada empresa. Esta é a consulta que você escreveria:

SELECT
  symbol,
  quote_date,
  price,
  FIRST_VALUE(price) OVER (PARTITION BY symbol ORDER BY quote_date) AS first_price
FROM stock_quotes;

Nessa consulta, particionamos os dados por symbol (PARTITION BY symbol). Isso cria uma partição separada para cada empresa (símbolo). A função FIRST_VALUE é aplicada a cada partição separadamente. Como no exemplo anterior, ordenamos os dados por quote_date. A função FIRST_VALUE retorna o preço da primeira linha em cada partição. Assim, a consulta retorna o símbolo, a data da cotação, o preço nessa data e o primeiro preço registrado para esse símbolo.

Podemos usar o valor da função FIRST_VALUE para calcular o crescimento percentual do preço atual em relação ao primeiro preço registrado, da seguinte forma:

SELECT
  symbol,
  quote_date,
  price,
  FIRST_VALUE(price) OVER (
    PARTITION BY symbol 
    ORDER BY quote_date) AS first_price,
  100.0 * (price - FIRST_VALUE(price) OVER (
         PARTITION BY symbol 
         ORDER BY quote_date)) 
   / FIRST_VALUE(price) OVER (
         PARTITION BY symbol 
         ORDER BY quote_date) AS perc_growth
FROM stock_quotes;

Exemplo 3. Primeiro valor de cada dia para cada empresa

Você pode usar a função FIRST_VALUE para calcular o preço de abertura (o primeiro preço do dia) para cada data, da seguinte forma:

SELECT DISTINCT
  symbol,
  CAST(quote_date AS DATE) AS date,
  FIRST_VALUE(price) OVER (
    PARTITION BY symbol, CAST(quote_date AS DATE) 
    ORDER BY quote_date) AS opening_price
FROM stock_quotes;

Aqui, particionamos os dados por símbolo (empresa) e data. Convertimos a coluna quote_date para DATE para extrair somente o valor da data. Como antes, usamos ORDER BY quote_date para classificar os valores por data. Usamos a função FIRST_VALUE e ela seleciona a primeira linha em cada partição, ou seja, o primeiro preço de cada data para cada empresa. Dessa forma, obtemos o preço de abertura de cada dia: o primeiro preço registrado nessa data. Também usamos DISTINCT para obter apenas uma linha para cada data e símbolo.

Para obter mais exemplos práticos de funções de janela do SQL, consulte nosso artigo: Exemplos de SQL Funções de Janela (Window Functions) em SQL . Você também pode visitar nosso artigo 11 SQL Funções de Janela (Window Functions) em SQL Exercises with Solutions, que contém exercícios práticos para funções de janela.

FIRST_VALUE e outras Funções de Janela (Window Functions) em SQL

FIRST_VALUE é semelhante a outras funções de janela.

FIRST_VALUE vs LAST_VALUE

A função FIRST_VALUE tem sua contraparte dupla, LAST_VALUE. Como o nome sugere, a função LAST_VALUE retorna o último valor na partição ordenada de um conjunto de resultados. Com FIRST_VALUE, você compara o valor atual com o ponto inicial dos dados, enquanto com LAST_VALUE, você o compara com o ponto final.

Ao usar a função LAST_VALUE, você deve se lembrar de definir a moldura da janela como RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING para garantir que ela inclua as linhas da linha atual até o final da partição. Caso contrário, OVER() usa o quadro de janela padrão para ORDER BY e LAST_VALUE retorna o valor da linha atual.

Para se lembrar desse detalhe e de outras nuances das funções de janela do SQL, recomendamos nossa Folha de dicas do SQL Funções de Janela (Window Functions) em SQL . Trata-se de um guia de referência rápida para download de funções de janela.

MIN vs FIRST_VALUE

A função FIRST_VALUE pode ser facilmente confundida com a funçãoMIN . A função MIN retorna o menor valor do conjunto de dados. A função FIRST_VALUE encontra o valor de uma expressão para a menor linha com base na expressão fornecida em ORDER BY.

Normalmente, você usa a função FIRST_VALUE com duas expressões diferentes como argumento da função FIRST_VALUE e em ORDER BY. Essa consulta, como já vimos várias vezes neste artigo, retorna o primeiro preço registrado da Apple, Inc.

SELECT
   quote_date,
   price,  
   FIRST_VALUE(price) OVER(ORDER BY quote_date) AS first_price
FROM stock_quotes
WHERE symbol = 'AAPL';

Se você usar a coluna price como argumento de FIRST_VALUE e em ORDER BY, a consulta também retornará o menor preço da Apple, Inc.

SELECT
   FIRST_VALUE(price) OVER(ORDER BY price) AS first_price
FROM stock_quotes
WHERE symbol = 'AAPL';

Essa consulta retorna várias linhas, uma para cada linha com o preço das ações da Apple.

Essa consulta retorna o preço mínimo da Apple, Inc.:

SELECT
  MIN(price)
FROM stock_quotes
WHERE symbol = 'AAPL';

A consulta retorna apenas uma linha com um valor: o preço mínimo registrado para a Apple.

Você pode usar a função MIN como uma função de janela:

SELECT
  quote_date,
  price,  
  MIN(price) OVER(ORDER BY quote_date) AS min_price
FROM stock_quotes
WHERE symbol = 'AAPL';

Essa consulta retorna o mínimo em execução da coluna price ordenada por quote_date. Em outras palavras, retornará o menor preço encontrado desde o início do conjunto de dados até aquela linha, inclusive, quando ordenado por quote_date.

FIRST_VALUE vs. LEAD e LAG

FIRST_VALUE também é semelhante às funções LEAD e LAG. LEAD e LAG retornam o valor em linhas subsequentes ou anteriores, enquanto FIRST_VALUE retorna o valor da primeira linha na partição. LEAD e LAG são melhores quando você precisa comparar uma sequência de valores, por exemplo, comparar as vendas de um mês para o outro. FIRST_VALUE é usado em cenários em que você faz referência à entrada inicial em um conjunto de dados.

Para obter uma visão geral dos tópicos mais importantes da função de janela SQL, consulte nosso artigo As 10 principais perguntas da entrevista sobre SQL Funções de Janela (Window Functions) em SQL

Conclusão e leitura adicional

A função FIRST_VALUE é uma importante função de janela do SQL. Ela é útil para analisar tendências ao longo do tempo, por exemplo, para ver como os preços das ações ou os números de vendas começam em um período. Aprender a usar FIRST_VALUE pode melhorar sua capacidade de analisar dados de séries temporais.

Se você estiver interessado em melhorar o uso das funções de janela do SQL, recomendamos nosso curso interativo Funções de Janela (Window Functions) em SQL. Ele contém 218 exercícios práticos para ajudá-lo a aprender a função de janela por meio da prática. Se você já conhece as funções de janela e está procurando mais prática, confira nosso Funções de Janela (Window Functions) em SQL Practice Set com 100 exercícios para ajudá-lo a praticar as funções de janela em cenários do mundo real.

Para obter um guia rápido sobre as funções de janela do SQL, consulte a Folha de dicas do SQL Funções de Janela (Window Functions) em SQL . Trata-se de um guia de referência rápida para funções de janela que está disponível on-line e pode ser baixado em PDF.

Todos os nossos cursos, inclusive Funções de Janela (Window Functions) em SQL e Funções de Janela (Window Functions) em SQL Practice Set, estão disponíveis individualmente ou como parte do nosso pacote Ilimitado Vitalício SQL Package. Esse pacote lhe dá acesso vitalício a todos os cursos de SQL atuais e futuros em nossa plataforma com um pagamento único. Quer esteja começando ou aprimorando suas habilidades em SQL, esse pacote apoia sua jornada de aprendizado em cada etapa. Inscreva-se hoje mesmo para aprimorar continuamente sua experiência em SQL.