LAG y LEAD para filas adyacentes
Acceda a los valores de las filas anterior y siguiente sin usar un self-join
LAG y LEAD para filas adyacentes es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.
La pregunta que hacen los entrevistadores
Una de las preguntas más habituales en las entrevistas para analistas es: «Compare cada fila con la anterior sin usar una autocombinación». Piense en los ingresos mes a mes, el inicio de sesión anterior de un usuario o el siguiente evento de una secuencia.
La respuesta clara son las funciones de ventana LAG y LEAD. Permiten que una fila consulte el valor de una fila vecina sin perder ningún detalle de las filas. En esta lección construirá un modelo mental preciso de cómo navegan por las filas adyacentes.
Qué hacen LAG y LEAD
LAG(col) devuelve el valor de col de la fila anterior. LEAD(col) devuelve el valor de la fila siguiente. «Anterior» y «siguiente» quedan definidos por completo mediante ORDER BY dentro de la cláusula OVER.
- LAG mira hacia atrás.
- LEAD mira hacia delante.
Ambas son funciones de ventana con desplazamiento: nunca agrupan las filas, sino que simplemente adjuntan el valor de una fila vecina a la fila actual.
Sintaxis básica de LAG
Esta es la estructura canónica. Tenemos una tabla sales con las columnas month y revenue. Queremos que cada fila muestre también los ingresos del mes anterior.
OVER (ORDER BY month) indica al motor cómo definir «anterior». La primera fila no tiene predecesora, por lo que prev_revenue es NULL en ella.
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;Interpretar el resultado
Para los datos 2024-01 = 100, 2024-02 = 130 y 2024-03 = 120, la consulta devuelve:
- Ene: ingresos 100, prev_revenue NULL
- Feb: ingresos 130, prev_revenue 100
- Mar: ingresos 120, prev_revenue 130
Cada fila tomó el valor de la fila situada justo encima en el conjunto ordenado. Sin autocombinaciones, sin subconsultas y sin perder filas.
LEAD mira hacia delante
LEAD es la imagen especular. Úselo cuando una fila necesite saber qué viene después, por ejemplo, la fecha de la siguiente compra para calcular el tiempo entre pedidos.
La última fila del conjunto ordenado no tiene sucesora, por lo que su resultado de LEAD es NULL.
SELECT
month,
revenue,
LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales
ORDER BY month;El argumento de desplazamiento
Ambas funciones aceptan un segundo argumento opcional: cuántas filas se deben saltar. LAG(col, 2) retrocede dos filas y LEAD(col, 3) avanza tres filas.
Los entrevistadores utilizan esto para pedir, por ejemplo, «los ingresos de hace dos meses» o «el valor tres filas más abajo». El desplazamiento predeterminado es 1.
SELECT
month,
revenue,
LAG(revenue, 2) OVER (ORDER BY month) AS revenue_2_months_ago
FROM sales
ORDER BY month;El argumento del valor predeterminado
Un tercer argumento proporciona un valor de sustitución cuando no existe una fila vecina, en lugar de obtener NULL. La firma es LAG(col, offset, default).
Esto resulta útil cuando un cálculo posterior no admite NULL, por ejemplo, si se trata el valor anterior ausente como 0 para que la diferencia se siga calculando.
SELECT
month,
revenue,
LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales
ORDER BY month;PARTITION BY reinicia la ventana
Los datos reales rara vez contienen una única serie global. Normalmente se comparan los datos dentro de cada cliente, producto o región. PARTITION BY reinicia el cálculo de LAG/LEAD al principio de cada partición.
Esto significa que la primera fila de cada partición recibe NULL de LAG, sin que se filtre nunca un valor a través del límite hacia los datos de otro cliente.
SELECT
customer_id,
order_date,
amount,
LAG(amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS prev_amount
FROM orders;Ejemplo resuelto: días entre pedidos
Una tarea frecuente consiste en medir el intervalo entre los pedidos consecutivos de un cliente. Obtenga la fecha del pedido anterior con LAG y, después, réstela.
El primer pedido de cada cliente produce NULL porque no existe una fecha anterior que restar. Este es exactamente el tipo de comparación por cliente que los entrevistadores esperan que resuelva con funciones de ventana.
SELECT
customer_id,
order_date,
order_date - LAG(order_date) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS days_since_prev
FROM orders;¿Por qué no una autocombinación?
Antes de las funciones de ventana, la solución era una autocombinación correlacionada: unir la tabla consigo misma según «la fila cuya fecha sea la mayor entre las que están por debajo de esta». Funciona, pero es verbosa, propensa a errores cuando hay empates y, a menudo, más lenta.
LAG/LEADexpresan la intención en una sola línea.- Se evalúan en una única pasada ordenada.
- Los empates se resuelven de forma determinista mediante su
ORDER BY.
Decir «usaría LAG en lugar de una autocombinación» demuestra dominio del tema.
Error común: falta de ORDER BY
Sin un ORDER BY en la cláusula OVER, la «fila anterior» no está definida. Algunos motores lo rechazan y otros devuelven resultados impredecibles. Ordene siempre la ventana.
Recuerde también que el orden dentro de OVER es independiente del ORDER BY externo de la consulta. La ventana decide cuál es la fila vecina; la cláusula externa solo decide el orden de presentación.
Comprobación rápida
Ponga a prueba su comprensión de las funciones de ventana de desplazamiento.
Repaso
Ahora conoce las funciones de ventana de desplazamiento:
LAG(col)lee la fila anterior yLEAD(col)lee la siguiente, según elORDER BYde la ventana.- Argumentos opcionales:
LAG(col, offset, default). PARTITION BYreinicia la navegación para cada grupo, por lo que las filas de los extremos sonNULL.- Reemplazan las autocombinaciones engorrosas al comparar filas adyacentes.
A continuación aplicaremos esto a la pregunta de analista que casi siempre aparece: el cambio entre periodos.
Preguntas frecuentes
¿La lección «LAG y LEAD para filas adyacentes» es gratis?
Sí — el texto completo de «LAG y LEAD para filas adyacentes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «LAG y LEAD para filas adyacentes»?
Acceda a los valores de las filas anterior y siguiente sin usar un self-join Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Interview Prep?
No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «LAG y LEAD para filas adyacentes»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?
Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- LAG y LEAD para filas adyacentes
- Cambio entre periodos
- NTILE para crear grupos
- FIRST_VALUE, LAST_VALUE y límites del marco