Advertisement
AlexErin1308

Расчёт Retention Rate: практика.TASK# 1-3

Jun 18th, 2024
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PostgreSQL 2.43 KB | Source Code | 0 0
  1. --1.Напишите запрос для определения профиля пользователя. Для этого на экране отобразите три поля: идентификатор пользователя;номер месяца оплаты товара; номер месяца, когда пользователь впервые оплатил товар.
  2. SELECT user_id, EXTRACT('month' FROM paid_at) AS month_paid,
  3.        MIN(EXTRACT('month' FROM paid_at)) OVER(PARTITION BY user_id) AS first_month_paid
  4. FROM tools_shop.orders
  5. WHERE DATE_TRUNC('day', paid_at)::date BETWEEN '2020-01-01' AND '2020-12-31'
  6.  
  7. --2.Месяц первой покупки играет роль когорты. Кроме того, высчитав месяц покупки, можно считать пользователей. Положите предыдущий код в WITH или подзапрос. Сгруппируйте данные по когорте и месяцу покупки и подсчитайте число уникальных пользователей.
  8. WITH profile AS (
  9.     SELECT user_id, EXTRACT('month' FROM paid_at) AS month_paid,
  10.        MIN(EXTRACT('month' FROM paid_at)) OVER(PARTITION BY user_id) AS cohort
  11.     FROM tools_shop.orders
  12.     WHERE DATE_TRUNC('day', paid_at)::date BETWEEN '2020-01-01' AND '2020-12-31'  
  13. )
  14. SELECT cohort, month_paid,
  15.        COUNT(DISTINCT profile.user_id) AS cnt_user
  16. FROM profile
  17. GROUP BY cohort, month_paid
  18.  
  19. --3.По примеру из теории подсчитайте Retention Rate. Отобразите три поля:когорту;месяц;Retention Rate, округлённый до четырёх знаков после запятой и умноженный на 100. Отсортируйте таблицу по когорте и по месяцу.
  20. WITH profile AS (
  21.     SELECT user_id, EXTRACT('month' FROM paid_at) AS month_paid,
  22.        MIN(EXTRACT('month' FROM paid_at)) OVER(PARTITION BY user_id) AS cohort
  23.     FROM tools_shop.orders
  24.     WHERE DATE_TRUNC('day', paid_at)::date BETWEEN '2020-01-01' AND '2020-12-31'),  
  25.     cohorts AS (
  26.         SELECT cohort, month_paid,
  27.                COUNT(DISTINCT profile.user_id) AS cnt_user
  28.         FROM profile
  29.         GROUP BY cohort, month_paid)
  30. SELECT cohort, month_paid,
  31.        ROUND(cnt_user::numeric/MAX(cnt_user) OVER (PARTITION BY cohort)::numeric,4) * 100 AS lk
  32. FROM cohorts
  33. ORDER BY cohort, month_paid
  34.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement