De ventanaestándar SQL

LEAD

Toma un valor de la fila siguiente para compararlo con el de la actual.

Sintaxis

LEAD(<expresión>) OVER (ORDER BY <criterio de orden>)
LEAD(<expresión>, <desplazamiento>, <por defecto>) OVER (ORDER BY <criterio de orden>)
LEAD(<expresión>) OVER (PARTITION BY <grupo> ORDER BY <criterio de orden>)

El reflejo de LAG: mira la fila de abajo en el orden indicado y devuelve un valor de ella. El desplazamiento es cuántas filas hacia delante (1 por defecto), y el tercer argumento se usa cuando no hay fila siguiente. Útil para saber qué vino «después»: cuándo llegó el siguiente pedido y cuánto tiempo pasó hasta él.

Datos para los ejemplos

employees

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

orders

idcreated_atamount
12026-07-03 10:15:00120.50
22026-07-28 18:40:0080.25
32026-08-09 09:05:00199.99
42026-08-21 14:30:0045.00
52026-09-02 11:00:0064.75

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.

La fecha del siguiente pedido
SELECT id, created_at,
LEAD(created_at) OVER (ORDER BY created_at) AS next_order
FROM orders;
idcreated_atnext_order
12026-07-03 10:15:002026-07-28 18:40:00
22026-07-28 18:40:002026-08-09 09:05:00
32026-08-09 09:05:002026-08-21 14:30:00
42026-08-21 14:30:002026-09-02 11:00:00
52026-09-02 11:00:00NULL

El último pedido no tiene siguiente, así que ahí hay NULL.

Cuánto tiempo falta para el siguiente pedido
SELECT id, created_at,
LEAD(created_at) OVER (ORDER BY created_at) - created_at AS time_to_next
FROM orders;
idcreated_attime_to_next
12026-07-03 10:15:0025 days 08:25:00
22026-07-28 18:40:0011 days 14:25:00
32026-08-09 09:05:0012 days 05:25:00
42026-08-21 14:30:0011 days 20:30:00
52026-09-02 11:00:00NULL
El siguiente de su departamento
SELECT name, department, salary,
LEAD(name) OVER (PARTITION BY department ORDER BY salary DESC) AS next_in_department
FROM employees;
namedepartmentsalarynext_in_department
Emmabackend1200Liam
Liambackend1000NULL
Sophiadesign1200NULL
Oliviafrontend1350Noah
Noahfrontend950NULL

PARTITION BY busca el «siguiente» solo dentro del departamento: después de Liam en backend no hay nadie.

Ten en cuenta

Para la última fila el resultado es NULL. Si necesitas otro valor, pasa el tercer argumento: LEAD(amount, 1, 0).

La fila «siguiente» la define el ORDER BY de OVER, no el ORDER BY del final de la consulta. Si ordenas el resultado de otra manera, la siguiente sigue siendo la misma fila.

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