Модульні уроки (4/4)
Зміни: LAG і LEAD
Зміни: LAG і LEAD
У послідовних і часових даних вам часто потрібно порівняти поточний рядок із рядком попереднього дня. У «стандартному» SQL це вимагає дуже небезпечних (і дуже повільних) самооб’єднань.
Функції LAG() (попередній рядок) і LEAD() (наступний рядок) вирішують саме цю проблему з надзвичайною швидкістю та елегантністю.
Погляд у минуле та майбутнє
SELECT
created_at,
total_amount,
LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;У цьому прикладі кожен рядок зручно міститиме кількість, вироблену тією самою таблицею, зміщену вперед на один рядок (назад у часі). Ми можемо легко відняти total_amount - LAG(...), щоб обчислити різницю або відсоткові зміни за місяць!
Подібним чином LEAD() витягне значення з рядка прямо під поточним.
З таблиці «products» витягніть «id», «launched_on», «price» і додайте «prev_price», тобто «price» продукту, який логічно вважається «попереднім», у порядку зростання «launched_on».
Показати підказку
Використовуйте LAG(ціна) OVER(ORDER BY launched_on ASC)
Рішення доступне після 3 спроб
Як би ви обчислили стрибки рейтингу на окремого користувача? Змоделюйте це: із таблиці «reviews» витягніть «customer_id», «created_at», «rating» і «next_rating» (наступний відгук того самого клієнта з часом). Тож розділіть за 'customer_id', упорядкуйте за 'created_at' і використовуйте функцію правого вікна, щоб заглянути вперед.
Показати підказку
LEAD() разом із PARTITION BY і ORDER BY у OVER.
Рішення доступне після 3 спроб