Lecciones del módulo (4/4)
Desplazamientos: LAG y LEAD
Turnos: LAG y LEAD
En los datos secuenciales y basados en el tiempo, a menudo es necesario comparar la fila actual con la del día anterior. En SQL "estándar", hacerlo requiere autouniones muy peligrosas (y muy lentas).
Las funciones LAG() (fila anterior) y LEAD() (fila siguiente) resuelven exactamente este problema con extrema agilidad y elegancia.
Mirando al pasado y al futuro
SELECT
created_at,
total_amount,
LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;En el ejemplo, cada fila llevará convenientemente la cantidad producida por la misma tabla, desplazada una fila hacia adelante (hacia atrás en el tiempo). ¡Podemos restar fácilmente total_amount - LAG(...) para calcular la diferencia o los cambios porcentuales de mes a mes!
Del mismo modo, LEAD() extraerá el valor de la fila justo debajo de la actual.
De la tabla 'productos', extraiga 'id', 'launched_on', 'price' y agregue 'prev_price', es decir, el 'precio' del producto lógicamente considerado como 'anterior', en orden ascendente de 'launched_on'.
Mostrar pista
Utilice LAG(precio) OVER(ORDER BY launch_on ASC)
Solución disponible después de 3 intentos
¿Cómo calcularía los saltos de calificación por usuario individual? Simúlelo: de la tabla 'reviews' extraiga 'customer_id', 'created_at', 'rating' y 'next_rating' (la próxima revisión del mismo cliente a lo largo del tiempo). Entonces, divida por 'customer_id', ordene por 'created_at' y use la función de ventana derecha para mirar hacia adelante.
Mostrar pista
LEAD() junto con PARTITION BY y ORDER BY en OVER.
Solución disponible después de 3 intentos