Канал для всех, кто интересуется аналитикой данных и хочет изучить данную профессию
@onlyanalyst
Post #352
3.57K
This post (sticker, poll or similar) has no web preview. Open in Telegram
- 🔥 17
- ❤ 5
- 👍 4
- 🥰 1
ON @onlyanalystgroup
Showing posts older than #353 · Back to latest
This post (sticker, poll or similar) has no web preview. Open in Telegram
This post (sticker, poll or similar) has no web preview. Open in Telegram





This post (sticker, poll or similar) has no web preview. Open in Telegram
user_id -- ID пользователя
campaign -- канал привлечения
datetime -- дата и время визита
WITH first_visits AS (
SELECT
user_id,
MIN(DATE(datetime)) AS cohort_date
FROM visits
GROUP BY user_id
)
, retention_visits AS (
SELECT
fv.user_id,
fv.cohort_date,
DATE(v.datetime) AS visit_date
FROM first_visits fv
JOIN visits v ON fv.user_id = v.user_id
WHERE DATE(v.datetime) > fv.cohort_date -- позже, чем первый визит
AND DATE(v.datetime) <= fv.cohort_date + INTERVAL '7 day' -- но не позже 7 дней
)
, retained_users AS (
SELECT
cohort_date,
COUNT(DISTINCT user_id) AS retained_users_count
FROM retention_visits
GROUP BY cohort_date
)
, cohort_sizes AS (
SELECT
cohort_date,
COUNT(*) AS users_count
FROM first_visits
GROUP BY cohort_date
)
WITH first_visits AS (
SELECT
user_id,
MIN(DATE(datetime)) AS cohort_date
FROM visits
GROUP BY user_id
),
retention_visits AS (
SELECT
fv.user_id,
fv.cohort_date,
DATE(v.datetime) AS visit_date
FROM first_visits fv
JOIN visits v ON fv.user_id = v.user_id
WHERE DATE(v.datetime) > fv.cohort_date
AND DATE(v.datetime) <= fv.cohort_date + INTERVAL '7 day'
),
retained_users AS (
SELECT
cohort_date,
COUNT(DISTINCT user_id) AS retained_users_count
FROM retention_visits
GROUP BY cohort_date
),
cohort_sizes AS (
SELECT
cohort_date,
COUNT(*) AS users_count
FROM first_visits
GROUP BY cohort_date
)
SELECT
cs.cohort_date,
cs.users_count,
COALESCE(ru.retained_users_count, 0) AS retained_users,
ROUND(COALESCE(ru.retained_users_count, 0)::numeric / cs.users_count, 2) AS retention_rate
FROM cohort_sizes cs
LEFT JOIN retained_users ru ON cs.cohort_date = ru.cohort_date
ORDER BY cs.cohort_date;
This post (sticker, poll or similar) has no web preview. Open in Telegram
This post (sticker, poll or similar) has no web preview. Open in Telegram
This post (sticker, poll or similar) has no web preview. Open in Telegram
visits со следующими колонками:user_id -- ID пользователя
campaign -- канал привлечения
datetime -- дата и время визита
MIN(datetime) по каждому user_idDATE(...), чтобы убрать времяCTE. Это удобно: видно каждый шаг. Упрощает чтение кода интервьюеромWITH first_visits AS (
SELECT
user_id,
MIN(DATE(datetime)) AS cohort_date
FROM visits
GROUP BY user_id
)
cohort_sizes AS (
SELECT
cohort_date,
COUNT(*) AS users_count
FROM first_visits
GROUP BY cohort_date
)
WITH first_visits AS (
SELECT
user_id,
MIN(DATE(datetime)) AS cohort_date
FROM visits
GROUP BY user_id
),
cohort_sizes AS (
SELECT
cohort_date,
COUNT(*) AS users_count
FROM first_visits
GROUP BY cohort_date
)
SELECT *
FROM cohort_sizes
ORDER BY cohort_date;
GROUP BY, комментируй: "Я сейчас группирую по дате привлечения, чтобы получить когорты".CTE показывают твоё мышление (first_visits, cohort_sizes, а не cte1).This post (sticker, poll or similar) has no web preview. Open in Telegram
SELECT department, AVG(salary)
FROM employees
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;