SQL: EXPLAIN QUERY PLAN в SQLite — Сводка ошибок и их доля по сервисам

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

Сводка ошибок и их доля по сервисам

Что уже дано

Таблица audit_logs(log_id INTEGER PRIMARY KEY, service_name TEXT NOT NULL, event_level TEXT NOT NULL, duration_ms INTEGER NOT NULL). До 500 событий; положительные ID, непустые имена сервисов, event_level — ERROR, INFO или WARN. duration_ms — целое от 0 до 1000000. Сохранённый план исходной сводки ERROR содержит SCAN audit_logs и USE TEMP B-TREE FOR GROUP BY; это иллюстрация исходного запроса, а не требование к физическому плану вашего расширенного отчёта.

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

Для каждого сервиса хотя бы с одной ERROR верните total_events — число его ERROR-событий, avg_duration_ms — их среднюю длительность без округления. Дополнительно error_share — доля ERROR среди всех событий этого сервиса, округлённая до 4 знаков. INFO и WARN не участвуют в среднем длительностей ошибок, но входят в знаменатель доли. Разные события с одинаковой длительностью учитывайте отдельно.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 4 столбцов в указанном порядке и с этими именами: service_name, total_events, avg_duration_ms, error_share. service_name — TEXT, total_events — INTEGER; avg_duration_ms и error_share — REAL; NULL нет. Сортировка: service_name ASC COLLATE BINARY. Если ERROR нет, результат пустой. Отправляется SELECT/WITH с данными отчёта, команда EXPLAIN не требуется. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO audit_logs VALUES (1,'auth','ERROR',0),(2,'auth','ERROR',1),(3,'auth','INFO',900),(4,'billing','ERROR',10),(5,'billing','WARN',20),(6,'billing','INFO',100),(7,'quiet','INFO',100);
Вывод
auth|2|0.5|0.6667
billing|1|10.0|0.3333
РешениеSQL · SQLite

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

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

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