Уроки модуля (4/4)
Смены: ОТСТАВАНИЕ и ВЕДЕНИЕ
Смены: ОТСТАВАНИЕ и ВЕДЕНИЕ
В последовательных и временных данных часто необходимо сравнить текущую строку со строкой предыдущего дня. В «стандартном» 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», то есть «цену» продукта, который логически считается «предыдущим», в порядке возрастания «launched_on».
Показать подсказку
Используйте LAG(цену) OVER(ORDER BY launch_on ASC)
Решение доступно после 3 попыток
Как бы вы подсчитали скачок рейтинга отдельного пользователя? Смоделируйте это: из таблицы «отзывы» извлеките «customer_id», «create_at», «rating» и «next_rating» (следующий отзыв того же клиента с течением времени). Итак, разделите по «customer_id», упорядочите по «create_at» и используйте правую оконную функцию, чтобы заглянуть вперед.
Показать подсказку
LEAD() вместе с PARTITION BY и ORDER BY в OVER.
Решение доступно после 3 попыток