SQL: Соединение по диапазону значений — Классификация транзакций по диапазонам

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

Классификация транзакций по диапазонам

Что уже дано

Уже заполнены transactions(tx_id INTEGER PRIMARY KEY,amount INTEGER) и price_tiers(tier_id INTEGER PRIMARY KEY,label TEXT,range_start INTEGER NOT NULL,range_end INTEGER NOT NULL). Первичные ключи положительны и уникальны. amount — INTEGER от 0 до 2000000000 включительно либо NULL (целые копейки). Границы — INTEGER от 0 до 2000000001, range_start < range_end. Диапазоны [range_start,range_end) глобально не перекрываются; смежные границы и пробелы допустимы. Метка может быть NULL или повторяться, не содержит | и перевода строки. В каждой таблице от 0 до 1000 строк. Проверять отсутствие совпадения нужно по ключу tier_id, а не по метке.

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

Для каждого события верните tx_id, исходное amount и метку соответствующего диапазона. Событие вне всех диапазонов, включая NULL входного значения, сохраняется с NULL-меткой.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Столбцы в точном порядке: tx_id, amount, label. Одна строка на tx_id, сортировка tx_id ASC; пустая transactions даёт пустой результат. Идентификатор и счётчики — INTEGER без NULL, исходное значение — INTEGER либо NULL, метка — TEXT либо NULL. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO transactions VALUES (1,0),(2,50),(3,99),(4,100),(5,199),(6,200),(7,350),(8,500);
INSERT INTO price_tiers VALUES (1,'economy',0,100),(2,'standard',100,200),(3,'premium',200,500);
Вывод
1|0|economy
2|50|economy
3|99|economy
4|100|standard
5|199|standard
6|200|premium
7|350|premium
8|500|
РешениеSQL · SQLite

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

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

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