Минимальный пример: LAG(date_received) OVER (PARTITION BY product_id ORDER BY date_received) показывает предыдущую дату получения продукта.
Практический фокус — сначала получить аналитический столбец, а затем фильтровать результат через CTE или подзапрос.
Топ-3 ошибки: не задать сортировку для LAG/LEAD, фильтровать ROW_NUMBER в том же WHERE, забыть убрать строки с пустым date_received.
💻 Выполнимые примеры
Соседние даты продукта
Разогрев перед первым заданием.
SELECT
product_id,
date_received,
LAG(date_received) OVER (
PARTITION BY product_id
ORDER BY date_received
) AS previous_date_received,
LEAD(date_received) OVER (
PARTITION BY product_id
ORDER BY date_received
) AS next_date_received
FROM purchase_order_details
WHERE date_received IS NOT NULL;
Почему так: Фильтр по date_received стоит до оконной функции, поэтому окно строится только по строкам с указанной датой.
Топ продуктов по quantity
Пример для пятого задания.
WITH ranked_products AS (
SELECT
product_id,
quantity,
DENSE_RANK() OVER (
ORDER BY quantity DESC
) AS quantity_rank
FROM purchase_order_details
)
SELECT *
FROM ranked_products
WHERE quantity_rank <= 5;
Почему так:DENSE_RANK не пропускает ранги при одинаковом количестве, поэтому топ-5 может вернуть больше пяти строк.