SQL: EXPLAIN QUERY PLAN в SQLite — Отбор клиентов и разница с максимальным лимитом

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

Отбор клиентов и разница с максимальным лимитом

Что уже дано

Таблица customers(customer_id INTEGER PRIMARY KEY, region TEXT NOT NULL, status TEXT NOT NULL, credit_limit INTEGER NOT NULL). До 500 клиентов; ID положительные, region — NORTH, SOUTH или WEST, status — ACTIVE либо INACTIVE, лимит — целое от 0 до 1000000. Сохранённый план исходной выборки содержит SCAN customers и USE TEMP B-TREE FOR ORDER BY. Вы расширяете данные этой выборки; конкретный план расширенного запроса не проверяется.

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

Выведите всех ACTIVE-клиентов NORTH с credit_limit строго больше 50000. Сохраните customer_id, region, credit_limit. Дополнительно credit_gap — разность между наибольшим лимитом среди этих же подходящих клиентов и лимитом данной строки. Клиенты других регионов и статусов не влияют на максимум. При равных лимитах сохраняйте всех клиентов.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 4 столбцов в указанном порядке и с этими именами: customer_id, region, credit_limit, credit_gap. region — TEXT; остальные столбцы INTEGER; NULL нет. Сортировка: credit_limit DESC, customer_id ASC. Если подходящих клиентов нет, результат пустой. Отправляется запрос данных, EXPLAIN не нужен. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO customers VALUES (1,'NORTH','ACTIVE',60000),(2,'NORTH','ACTIVE',90000),(3,'NORTH','INACTIVE',200000),(4,'SOUTH','ACTIVE',300000),(5,'NORTH','ACTIVE',50000);
Вывод
2|NORTH|90000|0
1|NORTH|60000|30000
РешениеSQL · SQLite

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

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

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