Доля клиентов с покупками в нескольких месяцах по месяцам
SQL, по которому посчитано
WITH bounds AS (
SELECT date_trunc('month', max(date)) AS last_month
FROM deals
),
months AS (
SELECT t.month_start
FROM generate_series(
(SELECT last_month FROM bounds) - INTERVAL '11 months',
(SELECT last_month FROM bounds),
INTERVAL '1 month'
) AS t(month_start)
),
valid_deals AS (
SELECT customer_id, date_trunc('month', date) AS month_start
FROM deals
WHERE status = 'Выиграна'
AND customer_id IS NOT NULL
AND customer_id <> ''
AND date >= (SELECT last_month FROM bounds) - INTERVAL '11 months'
AND date < (SELECT last_month FROM bounds) + INTERVAL '1 month'
),
customer_totals AS (
SELECT customer_id, count(DISTINCT month_start) AS months_bought
FROM valid_deals
GROUP BY customer_id
),
monthly_customers AS (
SELECT DISTINCT month_start, customer_id
FROM valid_deals
)
SELECT
m.month_start AS month_start,
count(DISTINCT mc.customer_id) AS customers,
count(DISTINCT CASE WHEN ct.months_bought > 1 THEN mc.customer_id END) AS multi_month_customers,
round(
1.0 * count(DISTINCT CASE WHEN ct.months_bought > 1 THEN mc.customer_id END)
/ nullif(count(DISTINCT mc.customer_id), 0),
4
) AS multi_month_share
FROM months m
LEFT JOIN monthly_customers mc ON mc.month_start = m.month_start
LEFT JOIN customer_totals ct ON ct.customer_id = mc.customer_id
GROUP BY m.month_start
ORDER BY m.month_start