Volver a la lista de artículos Artículos
Lectura de 10 minutos

Función SQL FIRST_VALUE

Descubra la potencia de la función FIRST_VALUE, una función ventana que devuelve el primer valor de una partición ordenada del conjunto de resultados. Esta función es útil para cualquiera que realice análisis de datos en SQL.

Las funciones ventana son una potente categoría de funciones que permiten realizar sofisticados análisis de datos en SQL. Estas funciones operan sobre una "ventana" de filas relacionadas con la fila actual, lo que permite preparar informes complejos como totales corridos, medias móviles, preparación de rankings y otros. Una de las funciones de ventana más comunes es la función FIRST_VALUE.

La función FIRST_VALUE devuelve el primer valor de una partición ordenada de un conjunto de resultados. La función puede ser útil en escenarios en los que se compara un valor actual con el primer valor de un determinado conjunto:

  • el cambio en los precios de las acciones desde el primer precio de emisión hasta el precio actual, lo que proporciona una visión del rendimiento de una acción desde su debut.
  • la variación del precio de un producto desde el precio de la primera emisión hasta el precio actual, para analizar las fluctuaciones de precios o el nivel de descuento con respecto al precio original.
  • el cambio en las primeras constantes vitales registradas (como la tensión arterial o el nivel de glucosa) de un paciente cuando ingresa por primera vez en el hospital, en comparación con las lecturas posteriores.
  • comparar la temperatura actual con la primera temperatura registrada en esta fecha o en este año, por ejemplo para estudiar cambios climáticos o patrones meteorológicos.

La función FIRST_VALUE es la contrapartida dual de otra función de ventana de SQL, LAST_VALUE. FIRST_VALUE devuelve el primer valor de un conjunto de datos, mientras que LAST_VALUE devuelve el último valor de un conjunto de datos.

Si quieres aprender sobre las funciones ventana, te recomiendo nuestro curso interactivo Funciones de ventana. Este curso es ideal para cualquiera que desee aprender las funciones de ventana de SQL y utilizarlas para trabajar con datos de forma más eficaz. El curso contiene más de 200 ejercicios interactivos que te ayudarán a ganar confianza en tus habilidades.

Cómo utilizar la función FIRST_VALUE

La función FIRST_VALUE devuelve el primer valor de una expresión en un conjunto ordenado por otra expresión. La sintaxis de FIRST_VALUE es sencilla:

FIRST_VALUE(expression) OVER (
	[PARTITION BY column_1, column_2, ...]
	ORDER BY expression2
	[ROWS BETWEEN range_start AND range_end]
)
  • expression - la columna o expresión de la que desea recuperar el primer valor.
  • ORDER BY - define la ordenación de las filas de datos en cada partición. FIRST_VALUE la utiliza para identificar la primera fila de la que tomar el valor.
  • PARTITION BY - opcional; divide el conjunto de resultados en particiones a las que se aplica la función FIRST_VALUE de forma independiente. Si se omite PARTITION BY, la función trata todo el conjunto de resultados como una única partición.
  • ROWS BETWEEN - opcional; define el marco de la ventana, es decir, el conjunto de filas de cada partición en relación con la fila actual.

Demostramos la función FIRST_VALUE mediante ejemplos en los que se utiliza una tabla stock_quotes. La tabla contiene los precios de las acciones de diferentes empresas (símbolos) en diferentes fechas y horas. La tabla tiene las siguientes columnas

  • id (integer) - Un identificador único para cada registro.
  • symbol (text) - El símbolo de la acción.
  • quote_date (timestamp) - La fecha y hora de la cotización de la acción.
  • price (decimal) - El precio de la acción en esa fecha.

A continuación se muestran algunas filas de ejemplo de la tabla (con datos ficticios):

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

Ejemplo 1: Uso simple de FIRST_VALUE - la primera cotización de una empresa determinada

Este es el uso más simple de la función FIRST_VALUE: queremos encontrar el primer precio registrado para una empresa en particular, como Apple Inc. (AAPL). Podemos utilizar la siguiente consulta SQL:

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

Esta consulta sólo selecciona las cotizaciones de Apple Inc. (símbolo AAPL). Selecciona la fecha de cotización y el precio en esa fecha. Utiliza la función FIRST_VALUE para seleccionar el primer precio registrado de la empresa. Todos los precios de las acciones de Apple se ordenan con OVER (ORDER BY quote_date). La función FIRST_VALUE devuelve el precio de la primera fila de esta ordenación, es decir, el primer precio registrado para Apple.

Ejemplo 2: FIRST_VALUE con PARTITION BY - Primer precio para todos los símbolos

Normalmente se utiliza FIRST_VALUE con PARTITION BY. De esta forma, la función FIRST_VALUE se aplica por separado en cada partición definida por PARTITION BY. Supongamos que necesita encontrar el primer precio para cada empresa. Aquí tiene la consulta que escribiría:

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

En esta consulta particionamos los datos por symbol (PARTITION BY symbol). Esto crea una partición separada para cada empresa (símbolo). La función FIRST_VALUE se aplica a cada partición por separado. Como en el ejemplo anterior, ordenamos los datos por fecha_cotización. La función FIRST_VALUE devuelve el precio de la primera fila de cada partición. Así, la consulta devuelve el símbolo, la fecha de cotización, el precio en esa fecha y el primer precio registrado para ese símbolo.

Podemos utilizar el valor de la función FIRST_VALUE para calcular el porcentaje de crecimiento de la cotización actual con respecto a la primera cotización registrada, de la siguiente manera:

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;

Ejemplo 3. Primer valor de cada día para cada empresa

Puede utilizar la función FIRST_VALUE para calcular el precio de apertura (el primer precio del día) para cada fecha, así

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;

Aquí dividimos los datos por símbolo (empresa) y fecha. Convertimos la columna quote_date en DATE para extraer sólo el valor de la fecha. Como antes, utilizamos ORDER BY quote_date para ordenar los valores por fecha. Utilizamos la función FIRST_VALUE y selecciona la primera fila de cada partición, es decir, el primer precio de cada fecha para cada empresa. De esta forma obtenemos el precio de apertura de cada día: el primer precio registrado en esa fecha. También utilizamos DISTINCT para obtener sólo una fila para cada fecha y símbolo.

Para ver más ejemplos prácticos de las funciones de ventana de SQL, consulte nuestro artículo: SQL Funciones de ventana Ejemplos. También puede visitar nuestro artículo 11 Ejercicios SQL Funciones de ventana con Soluciones que contiene ejercicios de práctica para funciones ventana.

FIRST_VALUE y Otras Funciones de ventana

FIRST_VALUE es similar a otras funciones ventana.

FIRST_VALUE vs LAST_VALUE

La función FIRST_VALUE tiene su contraparte dual, LAST_VALUE. Como su nombre indica, la función LAST_VALUE devuelve el último valor de la partición ordenada de un conjunto de resultados. Con FIRST_VALUE, se compara el valor actual con el punto inicial de los datos, mientras que con LAST_VALUE, se compara con el punto final.

Cuando se utiliza la función LAST_VALUE, hay que acordarse de establecer el marco de ventana en RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING para asegurarse de que incluye las filas desde la fila actual hasta el final de la partición. De lo contrario, OVER() utiliza el marco de ventana predeterminado para ORDER BY y LAST_VALUE devuelve el valor de la fila actual.

Para recordar este detalle y otros matices de las funciones de ventana de SQL, recomendamos nuestra Hoja de trucos de SQL Funciones de ventana . Es una guía de referencia rápida descargable para las funciones de ventana.

MIN vs FIRST_VALUE

La función FIRST_VALUE puede confundirse fácilmente con la funciónMIN . La función MIN devuelve el valor más pequeño del conjunto de datos. La función FIRST_VALUE encuentra el valor de una expresión para la fila más pequeña basándose en la expresión dada en ORDER BY.

Normalmente se utiliza la función FIRST_VALUE con dos expresiones diferentes como argumento de la función FIRST_VALUE y en ORDER BY. Esta consulta, como hemos visto muchas veces en este artículo, devuelve el primer precio registrado de Apple, Inc.

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

Si se utiliza la columna precio tanto como argumento de FIRST_VALUE como en ORDER BY, la consulta también devuelve el precio más pequeño de Apple, Inc.

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

Esta consulta devuelve varias filas, una por cada fila con el precio de las acciones de Apple.

Esta consulta devuelve el precio mínimo de Apple, Inc:

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

La consulta sólo devuelve una fila con un valor: el precio mínimo registrado para Apple.

Puede utilizar la función MIN como función de ventana:

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

Esta consulta devuelve el mínimo móvil de la columna price ordenado por quote_date. En otras palabras, devolverá el precio más bajo encontrado desde el inicio del conjunto de datos hasta esa fila inclusive, ordenado por quote_date.

FIRST_VALUE frente a LEAD y LAG

FIRST_VALUE también es similar a las funciones LEAD y LAG. LEAD y LAG devuelven el valor de las filas posteriores o anteriores, mientras que FIRST_VALUE devuelve el valor de la primera fila de la partición. LEAD y LAG son mejores cuando se necesita comparar una secuencia de valores, por ejemplo se comparan las ventas de un mes con las del siguiente. FIRST_VALUE se utiliza en escenarios en los que se hace referencia a la entrada inicial de un conjunto de datos.

Para obtener una visión general de los temas más importantes de la función de ventana SQL, consulte nuestro artículo Top 10 SQL Funciones de ventana Preguntas de la Entrevista

Conclusión y lecturas adicionales

La función FIRST_VALUE es una importante función ventana de SQL. Resulta útil para analizar tendencias a lo largo del tiempo, como por ejemplo ver cómo comienzan los precios de las acciones o las cifras de ventas a lo largo de un periodo. Aprender a utilizar FIRST_VALUE puede mejorar su capacidad para analizar datos de series temporales.

Si está interesado en mejorar el uso de las funciones de ventana de SQL, le recomendamos nuestro curso interactivo Funciones de ventana. Contiene 218 ejercicios prácticos que le ayudarán a aprender las funciones ventana a través de la práctica. Si ya conoce las funciones ventana y busca más práctica, consulte nuestr Funciones de ventana Practice Set con 100 ejercicios que le ayudarán a practicar las funciones ventana en escenarios reales.

Para obtener una guía rápida sobre las funciones de ventana de SQL, consulte la hoja de trucos de SQL Funciones de ventana . Es una guía de referencia rápida para las funciones de ventana que está disponible en línea y se puede descargar en formato PDF.

Todos nuestros cursos, incluidos Funciones de ventana y Funciones de ventana Practice Set, están disponibles por sí solos o como parte de nuestro paquete SQL Todo, para siempre . Este paquete le da acceso de por vida a todos los cursos de SQL actuales y futuros en nuestra plataforma con un pago único. Tanto si está empezando como si está avanzando en sus conocimientos de SQL, este paquete le ayuda en su viaje de aprendizaje en cada paso. Inscríbase hoy mismo para mejorar continuamente sus conocimientos de SQL.