WITH DealOutcomes AS (
-- Get deal outcomes for all customers who requested a demo
SELECT
customer,
MIN(CASE WHEN activity = 'requested_demo' THEN ts END) as demo_ts,
MIN(CASE WHEN activity = 'created_subscription' THEN ts END) as win_ts
FROM customer_stream
WHERE customer IS NOT NULL
GROUP BY 1
HAVING demo_ts IS NOT NULL
),
AccountSessions AS (
-- Count the number of sessions for each account before a demo request
SELECT
do.customer,
do.win_ts IS NOT NULL AS is_win,
COALESCE(COUNT(DISTINCT CASE WHEN cs.ts < do.demo_ts THEN cs.session_id END), 0) AS num_sessions
FROM DealOutcomes do
LEFT JOIN customer_stream cs ON do.customer = cs.customer
GROUP BY 1, 2
),
BinnedAccounts AS (
-- Bucket accounts by the number of sessions
SELECT
*,
CASE
WHEN num_sessions = 1 THEN '1'
WHEN num_sessions = 2 THEN '2'
WHEN num_sessions BETWEEN 3 AND 5 THEN '3-5'
WHEN num_sessions > 5 THEN '5+'
ELSE '0'
END AS sessions_bucket
FROM AccountSessions
)
SELECT
sessions_bucket,
(COUNT(CASE WHEN is_win THEN 1 END) * 1.0 / COUNT(*)) AS win_rate,
COUNT(*) as num_accounts
FROM BinnedAccounts
GROUP BY 1
ORDER BY 1;