De ventanaestándar SQL

LAST_VALUE

Toma el valor de la última fila de la ventana, pero solo con el marco correcto.

Sintaxis

LAST_VALUE(<expresión>) OVER (
  ORDER BY <criterio de orden>
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)

LAST_VALUE(<expresión>) OVER (
  PARTITION BY <grupo> ORDER BY <criterio de orden>
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)

Añade a cada fila el valor de la última fila de su ventana. Lo clave es el marco: por defecto, la ventana termina en la fila actual, así que sin ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING la «última» es la propia fila actual. Su contraparte es FIRST_VALUE.

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 bajo junto a cada uno
SELECT name, salary,
LAST_VALUE(salary) OVER (
ORDER BY salary DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS lowest
FROM employees;
namesalarylowest
Olivia1350950
Emma1200950
Sophia1200950
Liam1000950
Noah950950
Con marco y sin élAvanzado
SELECT name, salary,
LAST_VALUE(salary) OVER (ORDER BY salary DESC) AS without_frame,
LAST_VALUE(salary) OVER (
ORDER BY salary DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS lowest
FROM employees;
namesalarywithout_framelowest
Olivia13501350950
Emma12001200950
Sophia12001200950
Liam10001000950
Noah950950950

Sin marco, la ventana termina en la fila actual, así que without_frame simplemente repite el salario. Con el marco completo, LAST_VALUE ve todas las filas y devuelve el más bajo: 950.

Quién gana menos en cada departamento
SELECT name, department, salary,
LAST_VALUE(name) OVER (
PARTITION BY department ORDER BY salary DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS lowest_paid
FROM employees;
namedepartmentsalarylowest_paid
Emmabackend1200Liam
Liambackend1000Liam
Sophiadesign1200Sophia
Oliviafrontend1350Noah
Noahfrontend950Noah

Ten en cuenta

Sin marco, LAST_VALUE casi siempre devuelve el valor actual: la ventana termina en la fila actual. Añade ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

A menudo es más sencillo prescindir del marco: FIRST_VALUE(salary) OVER (ORDER BY salary) da lo mismo que LAST_VALUE con el marco completo y el orden DESC.

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