SQL: Переписывание условий и проверка эквивалентности — Ноябрьский отчёт с паузами клиентов

Практическая задача по SQL на тему «Переписывание условий и проверка эквивалентности». В условии приведены схема таблиц, ограничения данных, имена столбцов результата и порядок сортировки. Напишите один SELECT или WITH-запрос для SQLite. Перед проверкой продумайте пустой результат, повторяющиеся строки и границы диапазонов, если они встречаются в условии. Проверяется результат запроса, поэтому допустима эквивалентная реализация. Сначала решите задачу самостоятельно; продолжение практики доступно в полном курсе продвинутого SQL.

Ноябрьский отчёт с паузами клиентов

Что уже дано

Таблица orders(order_id INTEGER PRIMARY KEY, customer_id INTEGER NOT NULL, created_at TEXT NOT NULL, amount INTEGER NOT NULL) и customer_pauses(pause_id INTEGER PRIMARY KEY, customer_id INTEGER NOT NULL, from_at TEXT NOT NULL, to_at TEXT NOT NULL). До 500 заказов и 100 пауз, положительные ID, amount от 0 до 1000000. Все метки корректные UTC за 2024 год или 2025-01-01: YYYY-MM-DD HH:MM:SS с необязательной дробной частью из трёх цифр. date-only и NULL отсутствуют. Паузам разрешено пересекаться; from_at >= to_at означает пустую паузу. Уже создан обычный индекс orders(created_at).

Что нужно сделать

Исходный отчёт выбирает заказы ноября 2024 по strftime('%Y-%m', created_at) = '2024-11'. Постройте его расширенную версию: ноябрь включает начало 1 ноября и исключает начало 1 декабря; дополнительно исключите заказ, если его время входит хотя бы в одну полуоткрытую паузу [from_at, to_at) того же клиента. Паузы других клиентов не влияют. Каждый разрешённый заказ выводится один раз с order_id, customer_id, amount. При написании запроса учитывайте возможность диапазонного поиска по исходному столбцу; проверка оценивает результат, поэтому эквивалентные формы допустимы.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 3 столбцов в указанном порядке и с этими именами: order_id, customer_id, amount. Все столбцы INTEGER; NULL нет. Сортировка: order_id ASC. Если разрешённых ноябрьских заказов нет, результат пустой. План и время не проверяются; отправляется SELECT/WITH, без DDL/EXPLAIN. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO orders VALUES (1,10,'2024-11-01 00:00:00',10),(2,10,'2024-11-10 00:00:00',20),(3,10,'2024-11-15 00:00:00',30),(4,20,'2024-11-30 23:59:59.999',40),(5,20,'2024-12-01 00:00:00',50),(6,20,'2024-10-31 23:59:59.999',60);
INSERT INTO customer_pauses VALUES (1,10,'2024-11-10 00:00:00','2024-11-15 00:00:00');
Вывод
1|10|10
3|10|30
4|20|40
РешениеSQL · SQLite

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи