Перейти до основного вмісту
Модуль 13 · Урок 4 із 452/57 у курсі~12 min
Модульні уроки (4/4)

Зміни: LAG і LEAD

Зміни: LAG і LEAD

У послідовних і часових даних вам часто потрібно порівняти поточний рядок із рядком попереднього дня. У «стандартному» SQL це вимагає дуже небезпечних (і дуже повільних) самооб’єднань.

Функції LAG() (попередній рядок) і LEAD() (наступний рядок) вирішують саме цю проблему з надзвичайною швидкістю та елегантністю.

Погляд у минуле та майбутнє

SQL
SELECT
  created_at,
  total_amount,
  LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;

У цьому прикладі кожен рядок зручно міститиме кількість, вироблену тією самою таблицею, зміщену вперед на один рядок (назад у часі). Ми можемо легко відняти total_amount - LAG(...), щоб обчислити різницю або відсоткові зміни за місяць!

Подібним чином LEAD() витягне значення з рядка прямо під поточним.

вправи#sql.m13.l4.e1
Спроби: 0Завантаження…

З таблиці «products» витягніть «id», «launched_on», «price» і додайте «prev_price», тобто «price» продукту, який логічно вважається «попереднім», у порядку зростання «launched_on».

Завантаження редактора…
Показати підказку

Використовуйте LAG(ціна) OVER(ORDER BY launched_on ASC)

Рішення доступне після 3 спроб

вправи#sql.m13.l4.e2
Спроби: 0Завантаження…

Як би ви обчислили стрибки рейтингу на окремого користувача? Змоделюйте це: із таблиці «reviews» витягніть «customer_id», «created_at», «rating» і «next_rating» (наступний відгук того самого клієнта з часом). Тож розділіть за 'customer_id', упорядкуйте за 'created_at' і використовуйте функцію правого вікна, щоб заглянути вперед.

Завантаження редактора…
Показати підказку

LEAD() разом із PARTITION BY і ORDER BY у OVER.

Рішення доступне після 3 спроб