Junior
Analyse van het bezoek aan fitnessclubs Je werkt als analist bij een keten van fitnessclubs. Je hebt informatie over het bezoek van gebruikers en de abonnementen die ze kopen. Het is nodig om de effectiviteit van het gebruik van abonnementen te analyseren. Bereken voor elk type abonnement: • het totale aantal gebruikers dat dit type abonnement heeft gebruikt. Neem alleen unieke user_id's; • het totale aantal bezoeken met dit abonnement. Neem alle bezoeken van gebruikers met dit abonnement; • het aandeel van gebruikers van dit abonnement in procenten van het totale aantal alle gebruikers (afgerond op één decimaal). Voor het berekenen van het aandeel van gebruikers, gebruik de verhouding tussen het aantal gebruikers met dit abonnement en het totale aantal unieke gebruikers. Elke gebruiker kan slechts één abonnement hebben. Sorteer het resultaat op type abonnement in alfabetische volgorde. Invoerformaat Tabel memberships: • membership_id (int) — uniek identificator van het abonnement • user_id (int) — uniek identificator van de gebruiker • membership_type (text) — type abonnement Tabel visits:
sobes.tech AI
Antwoord van 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— общее количество уникальных пользователей.- Итоговый запрос объединяет данные и рассчитывает долю пользователей в процентах с округлением до одного знака.
Такой подход позволит получить полную картину по эффективности каждого типа абонемента.