SQL: RFM-анализ на дату среза — Статистика клиентских RFM-сегментов
Практическая задача по SQL на тему «RFM-анализ на дату среза». В условии приведены схема таблиц, ограничения данных, имена столбцов результата и порядок сортировки. Напишите один SELECT или WITH-запрос для SQLite. Перед проверкой продумайте пустой результат, повторяющиеся строки и границы диапазонов, если они встречаются в условии. Проверяется результат запроса, поэтому допустима эквивалентная реализация. Сначала решите задачу самостоятельно; продолжение практики доступно в полном курсе продвинутого SQL.
Статистика клиентских RFM-сегментов
Что уже дано
Таблицы clients(client_id INTEGER PRIMARY KEY, registration_date TEXT NOT NULL) и purchases(purchase_id INTEGER PRIMARY KEY, client_id INTEGER NOT NULL, purchase_time TEXT NOT NULL, total_rub INTEGER NOT NULL, state TEXT NOT NULL). До 500 строк в каждой. ID положительные, покупки принадлежат существующим клиентам. Суммы — целые неотрицательные рубли; state — success или cancelled. Даты UTC YYYY-MM-DD HH:MM:SS в 2023–2024; все клиенты зарегистрированы до среза.
Что нужно сделать
На срез 2024-09-01 00:00:00 учитывайте только success-покупки до среза включительно. Для каждого клиента frequency — число таких покупок, monetary — их сумма, recency_days — полностью прошедшие 24-часовые сутки от последней покупки до среза. Без покупок frequency и monetary равны 0, давность NULL. Сегменты: never_bought без покупок; recent_big при давности <= 45 и сумме >= 5000; recent_small при давности <= 45 и сумме < 5000; sleeping при давности > 45. Верните одну строку на каждый представленный сегмент: client_count — число клиентов, total_revenue — сумма их monetary, avg_frequency — среднее frequency по клиентам сегмента, округлённое до 2 знаков. Каждый клиент получает одинаковый вес в среднем.
Ввод и вывод
Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 4 столбцов в указанном порядке и с этими именами: segment, client_count, total_revenue, avg_frequency. segment — TEXT; client_count и total_revenue — INTEGER; avg_frequency — REAL. NULL нет. Сортировка: total_revenue DESC, client_count DESC, segment ASC. Пустой clients даёт пустой результат; отсутствующие сегменты не выводятся. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.
Пример
- Подготовка данных
INSERT INTO clients VALUES (1,'2023-01-01 00:00:00'),(2,'2023-01-01 00:00:00'),(3,'2023-01-01 00:00:00'),(4,'2023-01-01 00:00:00'),(5,'2023-01-01 00:00:00'); INSERT INTO purchases VALUES (1,1,'2024-08-01 00:00:00',6000,'success'),(2,2,'2024-08-01 00:00:00',100,'success'),(3,3,'2024-01-01 00:00:00',8000,'success'),(4,4,'2024-09-02 00:00:00',9000,'success'),(5,5,'2024-08-01 00:00:00',9000,'cancelled');
- Вывод
sleeping|1|8000|1.0 recent_big|1|6000|1.0 recent_small|1|100|1.0 never_bought|2|0|0.0
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- SQL: RFM-анализ на дату среза — RFM и покупки за последний месяц
- SQL: Агрегация, оконные вычисления и фильтрация — Категории-лидеры и доля в продажах
- SQL: SELF JOIN и поиск уникальных пар — Пары с несколькими общими проектами
- SQL: Календарная таблица и пропущенные даты — Непрерывный отчёт о звонках
- SQL: Объединение перекрывающихся интервалов — Объединённая занятость внутри отчётного окна
- SQL: Подсчёт одновременно активных интервалов — Максимальное число занятых столов
