sql WITH usercounts AS ( SELECT membershiptype, COUNT(DISTINCT userid) AS userscount FROM memberships GROUP BY membershiptype ),
Анализ посещаемости фитнес-клубов
sql WITH usercounts AS ( SELECT membershiptype, COUNT(DISTINCT userid) AS userscount FROM memberships GROUP BY membershiptype ),
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Анализ посещаемости фитнес-клубов
Вы работаете аналитиком в сети фитнес-клубов. У вас есть информация о посещениях пользователей и абонементах, которые они покупают. Необходимо проанализировать эффективность использования абонементов.
Рассчитайте для каждого типа абонемента: • общее количество пользователей, использовавших этот тип абонемента. Учитывайте только уникальные user_id; • общее количество посещений по этому абонементу. Учитывайте все посещения пользователей с данным абонементом; • долю пользователей этого абонемента в процентах от общего количества всех пользователей (с округлением до одного знака после запятой). Для вычисления доли пользователей используйте отношение количества пользователей с этим абонементом к общему числу всех уникальных пользователей.
У каждого пользователя может быть только один абонемент.
Отсортируйте результат по типу абонемента в алфавитном порядке.
Формат ввода Таблица memberships: • membership_id (int) — уникальный идентификатор абонемента • user_id (int) — уникальный идентификатор пользователя • membership_type (text) — тип абонемента
Таблица visits: • visit_id (int) — уникальный идентификатор визита • user_id (int) — идентификатор пользователя • visit_date (timestamp) — дата и время визита
Данные не содержат пропусков или некорректных значений.
Формат вывода Запрос должен вернуть таблицу с полями в таком порядке: • membership_type (text) — тип абонемента • users_count (int) — количество уникальных пользователей с данным типом абонемента • total_visits (int) — общее количество визитов пользователей с этим абонементом • user_share (numeric) — доля пользователей в процентах с этим абонементом от общего числа (округлена до 1 знака после запятой)
Результат сортируется по типу абонемента в алфавитном порядке.
Ответ
sql WITH user_counts AS ( SELECT membership_type, COUNT(DISTINCT user_id) AS users_count FROM memberships GROUP BY membership_type ),
total_users AS ( SELECT COUNT(DISTINCT user_id) AS total FROM memberships ),
visits_count AS ( SELECT m.membership_type, COUNT(v.visit_id) AS total_visits FROM visits v JOIN memberships m ON v.user_id = m.user_id GROUP BY m.membership_type )
SELECT uc.membership_type, uc.users_count, COALESCE(vc.total_visits, 0) AS total_visits, ROUND((uc.users_count::numeric / t.total) * 100, 1) AS user_share FROM user_counts uc JOIN total_users t ON true LEFT JOIN visits_count vc ON uc.membership_type = vc.membership_type ORDER BY uc.membership_type;