Sobes.tech
Junior
24

Анализ посещаемости фитнес-клубов Вы работаете аналитиком в сети фитнес-клубов. У вас есть информация о посещениях пользователей и абонементах, которые они покупают. Необходимо проанализировать эффективность использования абонементов. Рассчитайте для каждого типа абонемента: • общее количество пользователей, использовавших этот тип абонемента. Учитывайте только уникальные user_id; • общее количество посещений по этому абонементу. Учитывайте все посещения пользователей с данным абонементом; • долю пользователей этого абонемента в процентах от общего количества всех пользователей (с округлением до одного знака после запятой). Для вычисления доли пользователей используйте отношение количества пользователей с этим абонементом к общему числу всех уникальных пользователей. У каждого пользователя может быть только один абонемент. Отсортируйте результат по типу абонемента в алфавитном порядке. Формат ввода Таблица memberships: • membership_id (int) — уникальный идентификатор абонемента • user_id (int) — уникальный идентификатор пользователя • membership_type (text) — тип абонемента Таблица visits:

Компании, где спрашивали
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
),

visit_counts AS (
  SELECT
    m.membership_type,
    COUNT(v.visit_id) AS visits_count
  FROM visits v
  JOIN memberships m ON v.user_id = m.user_id
  GROUP BY m.membership_type
),

total_users AS (
  SELECT COUNT(DISTINCT user_id) AS total_users FROM memberships
)

SELECT
  uc.membership_type,
  uc.users_count,
  COALESCE(vc.visits_count, 0) AS visits_count,
  ROUND( (uc.users_count::numeric / tu.total_users) * 100, 1) AS user_share_percent
FROM user_counts uc
LEFT JOIN visit_counts vc ON uc.membership_type = vc.membership_type
CROSS JOIN total_users tu
ORDER BY uc.membership_type;

Объяснение:

  • user_counts — количество уникальных пользователей по типам абонементов.
  • visit_counts — количество посещений, связанных с каждым типом абонемента.
  • total_users — общее количество уникальных пользователей.
  • Итоговый запрос объединяет данные и рассчитывает долю пользователей в процентах с округлением до одного знака.

Такой подход позволит получить полную картину по эффективности каждого типа абонемента.