โš™๏ธ Tech/SQL, DB

[SQL/BigQuery] ๊ทธ๋ฃน๋ณ„ ํผ๋„ ๋ถ„์„

fiftyline 2025. 10. 10. 22:48
๋ฐ˜์‘ํ˜•

 

๐Ÿ“Œ ํŠธ๋ž˜ํ”ฝ์†Œ์Šค๋ณ„ 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์™€ ์ผ์น˜

๋ฐ˜์‘ํ˜•