Нужно найти, где бронирования, подписки или сессии пересекаются по времени?
Два интервала пересекаются, если начало одного раньше конца другого, и наоборот:
Это условие покрывает все случаи перекрытий, даже частичных и вложенных.
Теперь объедини данные сами с собой:
Хочешь анализировать бронирования по ресурсу? Добавь фильтр:
🔥 Теперь видно, какие заявки реально конфликтуют по времени.
➡️ SQL Ready | #совет
Два интервала пересекаются, если начало одного раньше конца другого, и наоборот:
a.start_at < b.end_at
AND b.start_at < a.end_at
Это условие покрывает все случаи перекрытий, даже частичных и вложенных.
Теперь объедини данные сами с собой:
SELECT a.id, b.id
FROM bookings a
JOIN bookings b
ON a.id < b.id
AND a.start_at < b.end_at
AND b.start_at < a.end_at;
a.id < b.id, чтобы не получить пары в обе стороны.Хочешь анализировать бронирования по ресурсу? Добавь фильтр:
AND a.room_id = b.room_id
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤11👍6🤝1
Эта шпаргалка собирает основные псевдоколонки Oracle и показывает, как использовать их на практике: нумерация строк, доступ к физическому адресу, работа с иерархиями, определение листовых/корневых узлов, генерация UUID, отслеживание изменений по SCN и просмотр историй строк. Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥10❤7🤝2
SKIP LOCKED позволяет управлять конкурентным доступом на уровне строки, а не всей таблицы, поэтому воркеры не ждут друг друга и не создают лишних блокировок.Сегодня в гайде:
• Забираем задачи параллельно и без конфликтов;
• Делаем атомарный “взять + обновить” в одном запросе;
• Распределяем очереди между воркерами под высокой нагрузкой.
Этот прием делает обработку задач масштабируемой даже при высоком параллелизме.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤11👍6🤝1
Сгенерированные колонки в PostgreSQL: ускоряем фильтры без лишних вычислений!
Когда одно и то же выражение постоянно считается в
Создаём таблицу с материализованным выражением:
Теперь
Фильтрация становится проще и быстрее:
Добавляем индекс:
Проверяем:
🔥 Должен быть
➡️ SQL Ready | #практика
Когда одно и то же выражение постоянно считается в
WHERE, запросы тормозят. В PostgreSQL это решается GENERATED ALWAYS AS … STORED — выражение вычисляется один раз и хранится как обычное поле.Создаём таблицу с материализованным выражением:
CREATE TABLE events (
id BIGSERIAL PRIMARY KEY,
payload JSONB NOT NULL,
event_type TEXT GENERATED ALWAYS AS (payload->>'type') STORED
);
Теперь
event_type больше не вычисляется на лету — значение лежит прямо в строке.Фильтрация становится проще и быстрее:
SELECT id
FROM events
WHERE event_type = 'purchase';
Добавляем индекс:
CREATE INDEX idx_events_event_type
ON events(event_type);
Проверяем:
EXPLAIN ANALYZE
SELECT id
FROM events
WHERE event_type = 'purchase';
Index Scan, без тяжёлых операций над JSONB. Сгенерированные колонки отлично подходят для повторяющихся вычислений:Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍10❤7
Соберём все возможные маршруты из аэропорта A в B — прямые, через одну пересадку и через две, без рекурсий и сложных конструкций.
В этом посте:
• Проверим, существует ли прямой путь, простой случай, но часто самый важный;
• Расширим поиск и найдём маршруты вида A => X => B, где X — автоматически вычисленная пересадка;
• Построим цепочки A => X => Y => B, что по сути является маленьким обходом графа.
Это базовая техника работы с графами, подходит для поиска зависимостей, цепочек действий и любых последовательностей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤8👍8🤝1
Нужно получить список всех дней, даже тех, которых нет в таблице?
Например, показать дни без заказов. PostgreSQL умеет генерировать последовательности прямо в запросе:
Никаких временных таблиц, никаких циклов.
Теперь можно объединить это с данными:
🔥 Пригодится для аналитики временных рядов,
заполнения пропусков и построения отчётов!
➡️ SQL Ready | #совет
Например, показать дни без заказов. PostgreSQL умеет генерировать последовательности прямо в запросе:
SELECT *
FROM generate_series('2025-01-01', '2025-01-31', interval '1 day');
generate_series() создаёт виртуальную таблицу с шагом по дате.Никаких временных таблиц, никаких циклов.
Теперь можно объединить это с данными:
SELECT g.day, COUNT(o.id) AS total
FROM generate_series('2025-01-01', '2025-01-31', interval '1 day') AS g(day)
LEFT JOIN orders o ON date(o.created_at) = g.day
GROUP BY g.day
ORDER BY g.day;
заполнения пропусков и построения отчётов!
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝14❤9👍7🔥1