๋ฐ์ํ
๐ ํธ๋ํฝ์์ค๋ณ product → cart → purchase ๋จ๊ณ๋ณ ์ ์ ์ ํ์จ์ ๊ณ์ฐํ๋ผ. (์์ฐจํผ๋)
WITH user_first_event AS (
SELECT
traffic_source,
user_id,
MIN(CASE WHEN event_type = 'product' THEN created_at END) AS first_product,
MIN(CASE WHEN event_type = 'cart' THEN created_at END) AS first_cart,
MIN(CASE WHEN event_type = 'purchase' THEN created_at END) AS first_purchase
FROM `bigquery-public-data.thelook_ecommerce.events`
WHERE event_type IN ('product', 'cart', 'purchase')
GROUP BY traffic_source, user_id
)
SELECT
traffic_source,
COUNTIF(first_product IS NOT NULL) AS product_users,
COUNTIF(first_cart IS NOT NULL AND first_cart > first_product) AS cart_users,
COUNTIF(first_purchase IS NOT NULL AND first_purchase > first_cart) AS purchase_users,
ROUND(100 * COUNTIF(first_cart IS NOT NULL AND first_cart > first_product) / COUNTIF(first_product IS NOT NULL), 2) AS product_to_cart_conv,
ROUND(100 * COUNTIF(first_purchase IS NOT NULL AND first_purchase > first_cart) / COUNTIF(first_cart IS NOT NULL), 2) AS cart_to_purchase_conv
FROM user_first_event
GROUP BY traffic_source;
๋๋ณด๊ธฐ
mysql
WITH first_event AS(
SELECT
traffic_source,
user_id,
MIN(CASE WHEN event_type = 'product' THEN DATE(created_at) END) AS first_product,
MIN(CASE WHEN event_type = 'cart' THEN DATE(created_at) END) AS first_cart,
MIN(CASE WHEN event_type = 'purchase' THEN DATE(created_at) END) AS first_purchase
FROM `bigquery-public-data.thelook_ecommerce.events`
GROUP BY traffic_source, user_id
)
SELECT
traffic_source,
SUM(CASE WHEN first_product IS NOT NULL THEN 1 ELSE 0 END) AS product_size,
SUM(CASE WHEN first_cart IS NOT NULL AND first_product < first_cart THEN 1 ELSE 0 END) AS cart_size,
SUM(CASE WHEN first_purchase IS NOT NULL AND first_cart < first_purchase THEN 1 ELSE 0 END) AS purchase_size,
ROUND(100*SUM(CASE WHEN first_cart IS NOT NULL AND first_product < first_cart THEN 1 ELSE 0 END)
/ NULLIF(SUM(CASE WHEN first_product IS NOT NULL THEN 1 ELSE 0 END),0),2) AS product_to_cart_conv,
ROUND(100*SUM(CASE WHEN first_purchase IS NOT NULL AND first_cart < first_purchase THEN 1 ELSE 0 END)
/ NULLIF(SUM(CASE WHEN first_cart IS NOT NULL AND first_product < first_cart THEN 1 ELSE 0 END),0),2) AS cart_to_purchase_conv
FROM first_event
GROUP BY traffic_source;
๐ ์ฝํธํธ๋ณ(์ฒซ๋ฐฉ๋ฌธ์ฃผ ๊ธฐ์ค) product → cart → purchase ๋จ๊ณ๋ณ ์ ์ ์ ํ์จ์ ๊ณ์ฐํ๋ผ. (์์ฐจํผ๋)
WITH user_cohort AS(
SELECT
user_id,
DATE_TRUNC(MIN(created_at),WEEK) as cohort_week
FROM `bigquery-public-data.thelook_ecommerce.events`
GROUP BY user_id
),
user_first_event AS (
SELECT
c.cohort_week,
e.user_id,
MIN(CASE WHEN e.event_type = 'product' THEN e.created_at END) AS first_product,
MIN(CASE WHEN e.event_type = 'cart' THEN e.created_at END) AS first_cart,
MIN(CASE WHEN e.event_type = 'purchase' THEN e.created_at END) AS first_purchase
FROM `bigquery-public-data.thelook_ecommerce.events` e
JOIN user_cohort c USING(user_id)
GROUP BY c.cohort_week, e.user_id
)
SELECT
cohort_week,
COUNT(*) AS cohort_size,
COUNTIF(first_product IS NOT NULL) AS product_users,
COUNTIF(first_cart IS NOT NULL AND first_cart > first_product) AS cart_users,
COUNTIF(first_purchase IS NOT NULL AND first_purchase > first_cart) AS purchase_users,
ROUND(100 * COUNTIF(first_cart IS NOT NULL AND first_cart > first_product) / COUNTIF(first_product IS NOT NULL), 2) AS product_to_cart_conv,
ROUND(100 * COUNTIF(first_purchase IS NOT NULL AND first_purchase > first_cart) / COUNTIF(first_cart IS NOT NULL), 2) AS cart_to_purchase_conv
FROM user_first_event
GROUP BY cohort_week
ORDER BY cohort_week;
๋๋ณด๊ธฐ
mysql
WITH user_cohort AS(
SELECT user_id, MIN(WEEKOFYEAR(DATE(created_at))) AS cohort_week
FROM `bigquery-public-data.thelook_ecommerce.events`
GROUP BY user_id
),
first_event AS(
SELECT
c.cohort_week,
e.user_id,
MIN(CASE WHEN e.event_type = 'product' THEN DATE(e.created_at) END) AS first_product,
MIN(CASE WHEN e.event_type = 'cart' THEN DATE(e.created_at) END) AS first_cart,
MIN(CASE WHEN e.event_type = 'purchase' THEN DATE(e.created_at) END) AS first_purchase
FROM `bigquery-public-data.thelook_ecommerce.events` e
LEFT JOIN user_cohort c ON e.user_id = c.user_id
GROUP BY c.cohort_week, e.user_id
)
SELECT
cohort_week,
SUM(CASE WHEN first_product IS NOT NULL THEN 1 ELSE 0 END) AS cohort_size,
ROUND(100*SUM(CASE WHEN first_cart IS NOT NULL AND first_product < first_cart THEN 1 ELSE 0 END)
/ IFNULL(SUM(CASE WHEN first_product IS NOT NULL THEN 1 ELSE 0 END),0),2) AS product_to_cart_conv,
ROUND(100*SUM(CASE WHEN first_purchase IS NOT NULL AND first_cart < first_purchase THEN 1 ELSE 0 END)
/ IFNULL(SUM(CASE WHEN first_cart IS NOT NULL THEN 1 ELSE 0 END),0),2) AS cart_to_purchase_conv
FROM first_event
GROUP BY cohort_week
* ์ฒซ๋ฒ์งธ ์ด๋ฒคํธ ๊ธฐ์ค ์ง๊ณ ์ด์
1. ๋จ์ํ & ์ค๋ณต ์ ๊ฑฐ
2. ์๊ฐ ์์ ๋ณด์ฅ
3. ์ค์ ๋น์ฆ๋์ค KPI์ ์ผ์น
๋ฐ์ํ
'โ๏ธ Tech > SQL, DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [SQL/BigQuery] ์ฝํธํธ๋ณ ์ฒซ๊ตฌ๋งค๊น์ง ๊ฑธ๋ฆฐ ํ๊ท ์ผ์ (0) | 2025.10.11 |
|---|---|
| [SQL/BigQuery] ์ ๊ท vs ๊ธฐ์กด ์ ์ ์ ๊ตฌ๋งค (0) | 2025.10.11 |
| [SQL/BigQuery] DAU, WAU, MAU (0) | 2025.10.10 |
| SQL ์ฑ๋ฅ ์ต์ ํ : ์๋ธ์ฟผ๋ฆฌ, WITH์ , EXPLAIN, ANALYZE (0) | 2025.07.16 |
| [MongoDB] Python์ผ๋ก DB์ ๋ฐ์ดํฐ ์ฝ์ , ์กฐํ, ์์ , ์ญ์ (0) | 2025.05.30 |