WINDOW FUNCTIONS — сравниваем строки без джойнов!
Когда нужно показать, как изменилась цена по сравнению со вчерашним днём — часто пишут
Вместо этого используем оконную функцию
Один проход по таблице, без соединений. План часто использует
Нужен топ-3 товаров по продажам в каждой категории? Используем
🔥 Не забывайте
➡️ SQL Ready | #практика
Когда нужно показать, как изменилась цена по сравнению со вчерашним днём — часто пишут
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
внутри окна — он определяет порядок, по которому сравниваются строки. Без него результаты могут быть непредсказуемыми.Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍6🔥5👎1
❤8👍4👎1🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤12👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Интерактивный сайт, где вы учитесь писать SQL-запросы в игровой форме. Всё происходит прямо в браузере: пишете запрос — сразу видите результат.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤10🔥9
Подходит для задач вроде «последний заказ клиента» или «первая операция по счёту». Работает компактно и быстрее оконных функций, если нужен один результат на группу.
Что важно знать:
• Используется с ORDER BY — сначала поле из DISTINCT ON, затем сортировка внутри групп.
• Без ORDER BY результат непредсказуем — зависит от физического порядка строк.
• Альтернатива ROW_NUMBER() — тот же результат, но без подзапросов и лишнего кода.
DISTINCT ON — мощный инструмент в арсенале PostgreSQL, когда важна лаконичность и производительность.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤7👍6🤝2
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤7👍5
В этой статье:
• Пошаговая сборка MariaDB из исходников и первые «твики» результатов
• Реализация минимального движка MEMEM с поддержкой CREATE/INSERT/SELECT
• Отличие API движков хранения MariaDB от Postgres
🔊 Подробное руководство лежит на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4🔥4
PARTITION PRUNING — читаем только нужные данные!
Когда таблица разрастается до сотен миллионов строк, даже простые запросы начинают тормозить. Но часто нам нужен только один месяц — зачем читать всё?
Чтобы ускорить выборку, разобьём таблицу на разделы по дате с помощью range partitioning:
Теперь создадим конкретные партиции — каждая отвечает за свой месяц:
Представим, что нам нужно посчитать сумму продаж только за январь 2024 года:
Добавим
🔥 Важно: pruning работает только, если условие по дате написано явно — без функций, кастов и переменных.
➡️ SQL Ready | #практика
Когда таблица разрастается до сотен миллионов строк, даже простые запросы начинают тормозить. Но часто нам нужен только один месяц — зачем читать всё?
Чтобы ускорить выборку, разобьём таблицу на разделы по дате с помощью range partitioning:
CREATE TABLE sales (
sale_date DATE,
amount NUMERIC
) PARTITION BY RANGE (sale_date);
Теперь создадим конкретные партиции — каждая отвечает за свой месяц:
CREATE TABLE sales_2024_01 PARTITION OF sales
FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE sales_2024_02 PARTITION OF sales
FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
Представим, что нам нужно посчитать сумму продаж только за январь 2024 года:
SELECT SUM(amount)
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31';
Добавим
EXPLAIN ANALYZE
, чтобы увидеть, как именно Postgres выполняет запрос:EXPLAIN ANALYZE
SELECT SUM(amount)
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31';
🔥 Важно: pruning работает только, если условие по дате написано явно — без функций, кастов и переменных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤6🔥6