De ventanaestándar SQL

FIRST_VALUE

Toma el valor de la primera fila de la ventana.

Sintaxis

FIRST_VALUE(<expresión>) OVER (ORDER BY <criterio de orden>)
FIRST_VALUE(<expresión>) OVER (PARTITION BY <grupo> ORDER BY <criterio de orden>)

Añade a cada fila el valor de la primera fila de su ventana: el salario más alto de la empresa, el nombre de quien lidera el departamento. El número de filas no cambia, así que es fácil comparar lado a lado: cuánto le falta a cada uno para llegar al primero. Su contraparte es LAST_VALUE, pero con ella hay que configurar el marco de la ventana.

Datos para los ejemplos

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

El salario más alto junto a cada uno
SELECT name, salary,
FIRST_VALUE(salary) OVER (ORDER BY salary DESC) AS top_salary
FROM employees;
namesalarytop_salary
Olivia13501350
Emma12001350
Sophia12001350
Liam10001350
Noah9501350
Quién lidera cada departamento
SELECT name, department, salary,
FIRST_VALUE(name) OVER (PARTITION BY department ORDER BY salary DESC) AS leader
FROM employees;
namedepartmentsalaryleader
Emmabackend1200Emma
Liambackend1000Emma
Sophiadesign1200Sophia
Oliviafrontend1350Olivia
Noahfrontend950Olivia
Cuánto falta para el salario más alto
SELECT name, salary,
FIRST_VALUE(salary) OVER (ORDER BY salary DESC) - salary AS gap_to_top
FROM employees;
namesalarygap_to_top
Olivia13500
Emma1200150
Sophia1200150
Liam1000350
Noah950400

Ten en cuenta

Con valores iguales, cualquiera de los empatados puede quedar «primero». Para un resultado estable, añade a ORDER BY un campo único.

A diferencia de LAST_VALUE, aquí el marco de la ventana no estorba: la ventana siempre empieza en la primera fila. Por eso el valor «último» es más fácil de obtener como FIRST_VALUE con el orden invertido.

El resultado no se puede usar en el WHERE de la misma consulta: calcúlalo primero en una subconsulta y filtra fuera.

Funciones relacionadas

Más detalles en el curso