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, status TEXT NOT NULL) и таблица окон lookup_windows(request_id INTEGER PRIMARY KEY, customer_id INTEGER NOT NULL, start_at TEXT NOT NULL, end_at TEXT NOT NULL). До 500 заказов и 30 окон, положительные ID, amount от 0 до 1000000, status — completed или cancelled. Все даты — корректные UTC-метки YYYY-MM-DD HH:MM:SS за 2024 год. Разрешены start_at >= end_at. Создан индекс orders(customer_id, created_at).
Что нужно сделать
Каждое окно задаёт клиента и полуоткрытый период [start_at, end_at). Выведите customer_id и created_at каждого заказа, подходящего каждому окну. Все статусы включаются. Каждая пара «окно — заказ» даёт отдельную строку: заказ в двух пересекающихся окнах выводится дважды; разные заказы с одной датой тоже сохраняются. Окно start_at >= end_at не даёт строк. Публичный пример содержит исходный поиск клиента 101 за май; скрытые наборы содержат другие и пересекающиеся окна.
Ввод и вывод
Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 2 столбцов в указанном порядке и с этими именами: customer_id, created_at. customer_id — INTEGER, created_at — TEXT; NULL нет. Сортировка: customer_id ASC, created_at ASC; порядок между полностью одинаковыми строками не важен. Без совпадений результат пустой. Сдаётся запрос данных; создание индекса и EXPLAIN не требуются, план не проверяется. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.
Пример
- Подготовка данных
INSERT INTO orders VALUES (1,101,'2024-05-01 00:00:00',10,'completed'),(2,101,'2024-05-12 10:00:00',20,'cancelled'),(3,101,'2024-06-01 00:00:00',30,'completed'),(4,20,'2024-05-02 00:00:00',40,'completed'); INSERT INTO lookup_windows VALUES (1,101,'2024-05-01 00:00:00','2024-06-01 00:00:00');
- Вывод
101|2024-05-01 00:00:00 101|2024-05-12 10:00:00
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- SQL: Агрегация, оконные вычисления и фильтрация — Категории-лидеры и доля в продажах
- SQL: SELF JOIN и поиск уникальных пар — Пары с несколькими общими проектами
- SQL: Календарная таблица и пропущенные даты — Непрерывный отчёт о звонках
- SQL: Объединение перекрывающихся интервалов — Объединённая занятость внутри отчётного окна
- SQL: Подсчёт одновременно активных интервалов — Максимальное число занятых столов
- SQL: EXPLAIN QUERY PLAN в SQLite — Сводка ошибок и их доля по сервисам
