Когда нужно показать, как изменилась цена по сравнению со вчерашним днём — часто пишут
JOIN таблицы самой с собой. Но это сложно, медленно и плохо масштабируется при работе с большими таблицами.Вместо этого используем оконную функцию
LAG() — она возвращает значение из предыдущей строки:SELECT
date,
price AS today,
LAG(price) OVER (
PARTITION BY product_id
ORDER BY date
) AS yesterday
FROM prices
WHERE product_id = 42;
Один проход по таблице, без соединений. План часто использует
Index Only Scan, особенно при хороших индексах. Это делает запросы заметно быстрее и эффективнее.Нужен топ-3 товаров по продажам в каждой категории? Используем
ROW_NUMBER():SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY category
ORDER BY sales DESC
) AS rn
FROM products
) AS ranked
WHERE rn <= 3;
🔥 Не забывайте
ORDER BY внутри окна — он определяет порядок, по которому сравниваются строки. Без него результаты могут быть непредсказуемыми.➡️ SQL Ready | #практика