Sobes.tech
Junior

Ανάλυση επισκεψιμότητας σε γυμναστήρια Εργάζεστε ως αναλυτής σε ένα δίκτυο γυμναστηρίων. Έχετε πληροφορίες σχετικά με τις επισκέψεις χρηστών και τις συνδρομές που αγοράζουν. Είναι απαραίτητο να αναλύσετε την αποτελεσματικότητα της χρήσης των συνδρομών. Υπολογίστε για κάθε τύπο συνδρομής: • τον συνολικό αριθμό χρηστών που χρησιμοποίησαν αυτόν τον τύπο συνδρομής. Λάβετε υπόψη μόνο μοναδικά user_id; • τον συνολικό αριθμό επισκέψεων με αυτήν τη συνδρομή. Λάβετε υπόψη όλες τις επισκέψεις χρηστών με αυτήν τη συνδρομή; • το ποσοστό χρηστών αυτής της συνδρομής επί του συνολικού αριθμού χρηστών (στρογγυλοποιημένο σε ένα δεκαδικό). Για τον υπολογισμό του ποσοστού χρηστών, χρησιμοποιήστε τη σχέση μεταξύ του αριθμού χρηστών με αυτήν τη συνδρομή και του συνολικού αριθμού μοναδικών χρηστών. Κάθε χρήστης μπορεί να έχει μόνο μία συνδρομή. Τα αποτελέσματα ταξινομήστε κατά τύπο συνδρομής σε αλφαβητική σειρά. Μορφή εισόδου Πίνακας memberships: • membership_id (int) — μοναδικός αναγνωριστικός κωδικός συνδρομής • user_id (int) — μοναδικός αναγνωριστικός κωδικός χρήστη • membership_type (text) — τύπος συνδρομής Πίνακας visits:

sobes.tech AI

Απάντηση από 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 — общее количество уникальных пользователей.
  • Итоговый запрос объединяет данные и рассчитывает долю пользователей в процентах с округлением до одного знака.

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