SQL: Формирование когорт — Месяц когорты и её первый успешный заказ

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

Месяц когорты и её первый успешный заказ

Что уже дано

Таблица orders(order_id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL, order_date TEXT NOT NULL, status TEXT NOT NULL). До 500 заказов; ID положительные; время UTC YYYY-MM-DD HH:MM:SS в 2024 году. status строго completed, cancelled или refunded. Несколько заказов пользователя могут иметь равное время.

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

Для каждого пользователя с completed-покупкой определите месяц когорты первой такой покупки и сохраните идентификатор и время самого первого успешного заказа. Первым считается минимальное order_date, при равенстве — минимальный order_id. cohort_month — первый день месяца этого заказа. Пользователи без completed-покупок не входят в результат.

Ввод и вывод

Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 4 столбцов в указанном порядке и с этими именами: user_id, cohort_month, first_order_id, first_order_at. user_id и first_order_id — INTEGER; cohort_month и first_order_at — TEXT; NULL нет. Сортировка: user_id ASC. Если completed-покупок нет, результат пустой. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.

Пример

Подготовка данных
INSERT INTO orders VALUES (1,1,'2024-01-15 00:00:00','cancelled'),(2,1,'2024-02-10 12:00:00','completed'),(3,1,'2024-03-01 00:00:00','completed'),(4,2,'2024-01-01 00:00:00','refunded');
Вывод
1|2024-02-01|2|2024-02-10 12:00:00
РешениеSQL · SQLite

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

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

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