Junior
Analiza frecventei în cluburile de fitness Lucrați ca analist într-o rețea de cluburi de fitness. Aveți informații despre vizitele utilizatorilor și abonamentele pe care le cumpără. Este necesar să analizați eficiența utilizării abonamentelor. Calculați pentru fiecare tip de abonament: • numărul total de utilizatori care au folosit acest tip de abonament. Luați în considerare doar user_id unice; • numărul total de vizite pentru acest abonament. Luați în considerare toate vizitele utilizatorilor cu acest abonament; • proporția utilizatorilor acestui abonament în procent din numărul total de utilizatori (rotunjit la o zecimală). Pentru calcularea proporției utilizatorilor, folosiți raportul dintre numărul de utilizatori cu acest abonament și numărul total de utilizatori unici. Fiecare utilizator poate avea doar un abonament. Sortați rezultatul după tipul de abonament în ordine alfabetică. Formatul de intrare Tabel memberships: • membership_id (int) — identificator unic al abonamentului • user_id (int) — identificator unic al utilizatorului • membership_type (text) — tipul abonamentului Tabel visits:
sobes.tech AI
Răspuns de la 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— общее количество уникальных пользователей.- Итоговый запрос объединяет данные и рассчитывает долю пользователей в процентах с округлением до одного знака.
Такой подход позволит получить полную картину по эффективности каждого типа абонемента.