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

Смены: ОТСТАВАНИЕ и ВЕДЕНИЕ

Смены: ОТСТАВАНИЕ и ВЕДЕНИЕ

В последовательных и временных данных часто необходимо сравнить текущую строку со строкой предыдущего дня. В «стандартном» 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», то есть «цену» продукта, который логически считается «предыдущим», в порядке возрастания «launched_on».

Загрузка редактора…
Показать подсказку

Используйте LAG(цену) OVER(ORDER BY launch_on ASC)

Решение доступно после 3 попыток

Упражнение#sql.m13.l4.e2
Попыток: 0Загрузка…

Как бы вы подсчитали скачок рейтинга отдельного пользователя? Смоделируйте это: из таблицы «отзывы» извлеките «customer_id», «create_at», «rating» и «next_rating» (следующий отзыв того же клиента с течением времени). Итак, разделите по «customer_id», упорядочите по «create_at» и используйте правую оконную функцию, чтобы заглянуть вперед.

Загрузка редактора…
Показать подсказку

LEAD() вместе с PARTITION BY и ORDER BY в OVER.

Решение доступно после 3 попыток