TGViewer
SQL Ready | Базы Данных SQL Ready | Базы Данных @sql_ready · 17.6K subscribers
Post #724 2.26K
WINDOW FUNCTIONS — сравниваем строки без джойнов!

Когда нужно показать, как изменилась цена по сравнению со вчерашним днём — часто пишут 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 | #практика
  • ❤ 11
  • 👍 6
  • 🔥 6
  • 👎 1
More from @sql_ready
  1. Oct 17, 2026📂 16 паттернов программирования, которые должен знать каждый разработчик! Например, Two P…
  2. Oct 16, 2026Почему перенос условия из ON в WHERE меняет семантику LEFT JOIN При использовании LEFT JOI…
  3. Oct 16, 2026⚡️ В сети начали массово сливать IT-курсы и книги известных онлайн школ Вот отсортированна…
  4. Oct 16, 2026👍 Интересная статья лежит на Хабре: «За пределами EXPLAIN: как увидеть выполнение запроса…
  5. Oct 15, 2026Переносите строки без промежуточной выборки! Обычно архивирование делают в два этапа: снач…
  6. Oct 15, 2026Требуются 7 человек, чтобы помогали собирать чат-ботов для бизнеса по блокам, как лего. Ст…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →