Sobes.tech
Назад к вопросам
Junior
13

Анализ посещаемости фитнес-клубов Вы работаете аналитиком в сети фитнес-клубов. У вас есть информация о посещениях пользователей и абонементах, которые они покупают. Необходимо проанализировать эффективность использования абонементов. Рассчитайте для каждого типа абонемента: • общее количество пользователей, использовавших этот тип абонемента. Учитывайте только уникальные 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 знака после запятой) Результат сортируется по типу абонемента в алфавитном порядке.

Компании, где спрашивали
01.tech

Ответ от нейросети

sobes.tech AI

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;