๐Ÿ“’ Today I Learn/๐Ÿ˜Š My SQL

SQL Challenge ์„ธ์…˜ #3 ํผ๋„(Funnel)๋ถ„์„

ny:D 2024. 5. 29. 22:57

240528 Today I Learn

ํผ๋„(Funnel)์ด๋ž€?

๐Ÿ’ก ํผ๋„(Funnel)์ด๋ž€?
์†Œ๋น„์ž์˜ ํ–‰๋™์„ ๊ธฐ์—… ๊ด€์ ์—์„œ ์žฌ๊ตฌ์„ฑํ•œ ๊ฒƒ์œผ๋กœ, ๊ณ ๊ฐ์ด ์œ ์ž…๋˜์–ด ์ „ํ™˜์— ์ด๋ฅด๋Š” ๋‹จ๊ณ„๋ฅผ ์ˆ˜์น˜๋กœ ํ™•์ธํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก 
→ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๊ณ ๊ฐ์ด ํผ๋„์˜ ๋๊นŒ์ง€ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ! ์ด๋ฅผ ์ „ํ™˜(conversion)/ Key Event ๋ผ๊ณ  ํ•œ๋‹ค.

ํผ๋„์˜ ์ข…๋ฅ˜๋“ค

1. ๋งˆ์ผ€ํŒ… ํผ๋„

์ถœ์ฒ˜ : ๋งˆ์ผ“ํ•๋žฉ

2.AARRR ํผ๋„

3. ์‚ฌ์šฉ์ž ๊ทธ๋ฃน๋ณ„ ํผ๋„ ๋น„๊ต 

์ถœ์ฒ˜ : ํ•ตํด์˜ ํผ๋„

ํผ๋„ ๋‹จ๊ณ„ ์ˆ˜๋ฆฝํ•˜๊ธฐ

๐Ÿ‘… ๋ง›๋ณด๊ธฐ ์˜ˆ์‹œ
๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ŠคํŒŒ๋ฅดํƒ€ ์ฝ”๋”ฉ ํด๋Ÿฝ์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€์ด๊ณ , ์‹ ์ฒญ ๋งˆ๊ฐ์ผ์ด ๋‹ค๊ฐ€์™€ ์ผ์ฃผ์ผ ์•ˆ์— ๋ฐ์ดํ„ฐ ๋ถ„์„ ํŠธ๋ž™ 3๊ธฐ์˜ ์ฐธ๊ฐ€์ž ์ˆ˜๋ฅผ 5๋ฐฐ ์ด์ƒ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? 

โœ… ๋‚ด๊ฐ€ ์“ด ๋‹ต์•ˆ
1. ํš๋“ - ์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ, ๊ณต๊ณ  ์กฐํšŒ, ์ปค๋ฆฌํ˜๋Ÿผ ์กฐํšŒ
2. ํ™œ์„ฑํ™” - ํšŒ์›๊ฐ€์ž…
3. ํš๋“ - ์ฐธ๊ฐ€ ์ง€์›์„œ ์ž„์‹œ์ €์žฅ 
4. ์œ ์ง€ - ์ฐธ๊ฐ€ ์ง€์›์„œ ์ œ์ถœ
5. ์ถ”์ฒœ - ์ดˆ๋Œ€, ๊ณต์œ 

 

1. ์„œ๋น„์Šค์˜ BM(Business Model)์„ ํŒŒ์•…ํ•œ๋‹ค. 

  • ์–ด๋–ป๊ฒŒํ•˜๋ฉด ์ˆ˜์ต์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
  • ์šฐ๋ฆฌ ํšŒ์‚ฌ, ์ด ์„œ๋น„์Šค๊ฐ€ ๋งค์ถœ์„ ๋‚ด๋Š” ๊ตฌ์กฐ๋Š” ๋ฌด์—‡์ผ๊นŒ?
  • ์ˆ˜์ต๊ณผ ์ง€์ถœ์˜ ํ๋ฆ„์€ ์–ด๋–จ๊นŒ?

2. BM์„ ๊ณ ๋ คํ•ด ํ•ต์‹ฌ ์ง€ํ‘œ์™€ ํผ๋„ ์Šคํ…์„ ์„ค๊ณ„ํ•˜๊ธฐ

์ถœ์ฒ˜ : https://brunch.co.kr/@uxdohyun/7

3. ์ดํƒˆ๋ฅ ์ด ํฐ ๋‹จ๊ณ„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํผ๋„์„ ์žฌ์„ค๊ณ„ํ•˜๊ธฐ

4. ๊ฐ ํผ๋„๋ณ„ ์ „ํ™˜์œจ์„ SQL๋กœ ๊ตฌํ•ด๋ณด๊ธฐ 

5. ํผ๋„์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• 

(1) ์ง„์ž…์œจ์„ ๋†’์ด๊ธฐ : ๊น”๋•Œ๊ธฐ ์œ„์— ๋ฌผ์„ ๋งŽ์ด ๋„ฃ๊ธฐ

  • ํ•ด๋‹น ํ™”๋ฉด๊นŒ์ง€์˜ ์ง„์ž…๋ฅ  (์ฆ‰ ํผ๋„ ์œ ์ž…๋Ÿ‰)์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ 
    • ๊ด‘๊ณ  ํšจ์œจ์„ ๋†’์ธ๋‹ค.
    • ๊ด‘๊ณ ๋น„๋ฅผ ์ฆ์•กํ•œ๋‹ค.

(2) ์ „ํ™˜์œจ ๋†’์ด๊ธฐ : ํƒˆ์ฃผ๋ฅผ ๋ง‰์•„๋ผ..!

  • ํผ๋„ ์ˆœ์„œ ๋ฐ”๊พธ๊ธฐ
  • ํผ๋„ ๊ฐœ์ˆ˜ ๋Š˜๋ฆฌ๊ธฐ : ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ์ง€๋งŒ ์„ค๋“๋ ฅ์„ ๋†’์ธ๋‹ค
  • ํผ๋„ ๊ฐœ์ˆ˜ ์ค„์ด๊ธฐ → ์ดํƒˆ์„ ๋ฐฉ์–ดํ•œ๋‹ค.
  • ํผ๋„ ๊ตฌ์กฐ ๋’ค์ง‘๊ธฐ  ์ตœ์ข… CTA ๋ฒ„ํŠผ์„ ๋งจ ์•ž์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

ํผ๋„ ๋ถ„์„ ๊ณผ์ œ

240529 Today I FINISHED

๐Ÿ’ก ์ „ํ™˜์œจ
์ „ํ™˜์œจ = ํŠน์ • ๋‹จ๊ณ„๋กœ ์ „ํ™˜๋œ ์‚ฌ์šฉ์ž ์ˆ˜ / ์ „์ฒด ์‚ฌ์šฉ์ž ์ˆ˜
ํผ๋„์—์„œ ๊ฐ๊ฐ์˜ ๋‹จ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ์ „ํ™˜(Conversion)์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๊ทธ ๋น„์œจ์€ ์ „ํ™˜์œจ(Conversion rate)์ด๋ผ๊ณ  ํ•œ๋‹ค.
→ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•œ ์‚ฌ๋žŒ ์ค‘, ์†Œ์ •์˜ ์œ ๋„๋œ ํ–‰์œ„๋ฅผ ํ•œ ๋ฐฉ๋ฌธ์ž์˜ ๋น„์œจ

๊ณผ์ œ 1. ์œ ์ €์˜ ๊ณ„์ • ์ƒ์„ฑ ํ›„ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ ์ „ํ™˜์œจ (location, device๋ณ„) 

๐Ÿ“Œ ๋ชฉํ‘œ: ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ ํ›„ 24์‹œ๊ฐ„ ์ด๋‚ด์— ํšŒ์›๊ฐ€์ž…์„ ์™„๋ฃŒํ•˜๋Š” ์ „ํ™˜์œจ์„ ์‚ฌ์šฉ์ž ์œ„์น˜์™€ ๊ธฐ๊ธฐ๋ณ„๋กœ ๊ณ„์‚ฐ.

์œ ์ €์˜ ๊ณ„์ • ์ƒ์„ฑ (create_user)  ํ›„ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ (complete_signup) ์ „ํ™˜์œจ์„ ์‚ฌ์šฉ์ž ์œ„์น˜(location), ๊ธฐ๊ธฐ(device) ๋ณ„๋กœ ๊ตฌํ•ด์ฃผ์„ธ์š”. 

๐Ÿ’ก ๊ฒฐ๊ณผ: location๊ณผ device๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ „ํ™˜์œจ์„ ๋ฐฑ๋ถ„์œจ๋กœ ์‚ฐ์ถœ.

  •  ์†Œ์ˆซ์  ๋‘˜์ž์งœ๋ฆฌ๊นŒ์ง€ ์ถœ๋ ฅ
  • ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ์ฒ˜์Œ ์œ ์ €๊ฐ€ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ ํ›„ ํ•˜๋ฃจ ์•ˆ์— ์™„๋ฃŒ๋˜์—ˆ์–ด์•ผ ํ•จ.
  • ๋ฐฑ๋ถ„๋ฅ ๋กœ ๊ตฌํ•ด์ฃผ์„ธ์š”.
๋”๋ณด๊ธฐ
์ผ๋ถ€
WITH create_user as
	(
	SELECT location,
		   device,
		   user_id,
		   occurred_at AS occurred_at_create_user
	FROM Basic.yammer_events y1
	WHERE event_name = 'create_user'
	),
	complete_signup as
	(
	SELECT user_id, occurred_at AS occurred_at_complete_signup
	FROM Basic.yammer_events y2
	WHERE event_name = 'complete_signup')
SELECT location, device, ROUND(COUNT(CASE WHEN occurred_at_complete_signup IS NOT NULL THEN 1 ELSE NULL END)/COUNT(*)*100.0,2) AS converted_rate_percent
FROM create_user cu LEFT JOIN complete_signup cs
	ON cu.user_id = cs.user_id
WHERE occurred_at_complete_signup IS NULL 
	  OR DATEDIFF(occurred_at_complete_signup, occurred_at_create_user) <= 1
GROUP BY location, device;



๊ณผ์ œ 2. ํšŒ์›๊ฐ€์ž… ์ „ํ™˜์œจ ๋‹จ๊ณ„๋ณ„ ๋ถ„์„

๐Ÿ“Œ ๋ชฉํ‘œ: ์œ ์ €์˜ ๊ณ„์ • ์ƒ์„ฑ๋ถ€ํ„ฐ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ๊นŒ์ง€์˜ ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ „ํ™˜์œจ์„ 24์‹œ๊ฐ„ ์ด๋‚ด์— ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ๋กœ ๊ณ„์‚ฐ.

  • ๊ณ„์ • ์ƒ์„ฑ(create_user) ํ›„ ์ด๋ฉ”์ผ ์ž…๋ ฅ(enter_email) ํ™”๋ฉด ์ง„์ž…๋ฅ .
  • ์ด๋ฉ”์ผ ์ž…๋ ฅ ํ™”๋ฉด(enter_email) ์ง„์ž… ํ›„ ๊ฐœ์ธ ์ •๋ณด ์ž…๋ ฅ(enter_info) ํ™”๋ฉด ์ง„์ž…๋ฅ .
  • ๊ฐœ์ธ ์ •๋ณด ์ž…๋ ฅ ํ™”๋ฉด ์ง„์ž…(enter_info) ํ›„ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ(complete_signup) ์ „ํ™˜์œจ.
  • ๊ณ„์ • ์ƒ์„ฑ(create_user) ํ›„ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ(complete_signup) ์ „ํ™˜์œจ.

๐Ÿ’ก ๊ฒฐ๊ณผ: ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ „ํ™˜์œจ์„ ๋ฐฑ๋ถ„์œจ๋กœ ์‚ฐ์ถœ.

  •  ์†Œ์ˆซ์  ๋‘˜์ž์งœ๋ฆฌ๊นŒ์ง€ ์ถœ๋ ฅ
  • ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ์ฒ˜์Œ ์œ ์ €๊ฐ€ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ ํ›„ ํ•˜๋ฃจ ์•ˆ์— ์™„๋ฃŒ๋˜์—ˆ์–ด์•ผ ํ•จ.
  • ๋ฐฑ๋ถ„๋ฅ ๋กœ ๊ตฌํ•ด์ฃผ์„ธ์š”.
๋”๋ณด๊ธฐ
WITH create_user AS
	(
	SELECT location,
		   device,
		   user_id,
		   MIN(occurred_at) AS occurred_at_create_user
	FROM Basic.yammer_events y1
	WHERE event_name = 'create_user'
	GROUP BY location, device, user_id
	),
	complete_signup AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_complete_signup
	FROM Basic.yammer_events y2
	WHERE event_name = 'complete_signup'
	GROUP BY user_id),
	enter_email AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_enter_email
	FROM Basic.yammer_events y3
	WHERE event_name = 'enter_email'
	GROUP BY user_id),
	enter_info AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_enter_info
	FROM Basic.yammer_events y4
	WHERE event_name = 'enter_info'
	GROUP BY user_id)
SELECT ROUND(COUNT(CASE WHEN occurred_at_enter_email IS NOT NULL THEN 1 ELSE NULL END)
			/COUNT(*)*100.0,2) AS create_user_to_enter_email,
	   ROUND(COUNT(CASE WHEN occurred_at_enter_info IS NOT NULL THEN 1 ELSE NULL END)
	   		/ COUNT(CASE WHEN occurred_at_enter_email IS NOT NULL THEN 1 ELSE NULL END)*100.0,2) AS enter_email_to_enter_info,
	   ROUND(COUNT(CASE WHEN occurred_at_complete_signup IS NOT NULL THEN 1 ELSE NULL END)
	   		/ COUNT(CASE WHEN occurred_at_enter_info IS NOT NULL THEN 1 ELSE NULL END)*100.0,2) AS enter_info_to_complete_signup,
	   ROUND(COUNT(CASE WHEN occurred_at_complete_signup IS NOT NULL THEN 1 ELSE NULL END)
	   		/COUNT(*)*100.0,2) AS create_user_to_complete_signup
FROM create_user cu 
	LEFT JOIN enter_email ee ON cu.user_id = ee.user_id
	LEFT JOIN enter_info ei ON cu.user_id = ei.user_id
	LEFT JOIN complete_signup cs ON cu.user_id = cs.user_id
WHERE occurred_at_enter_email IS NULL 
	  OR occurred_at_enter_info IS NULL
	  OR occurred_at_complete_signup IS NULL 
	  OR DATEDIFF(occurred_at_complete_signup, occurred_at_create_user) <= 1;

 

๊ณผ์ œ 3. ํšŒ์›๊ฐ€์ž… ์ „ํ™˜์œจ ๋ฐ ์ดํ›„ ํ–‰๋™ ์ „ํ™˜์œจ ๋ถ„์„

๐Ÿ“Œ ๋ชฉํ‘œ: ์œ ์ €๊ฐ€ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ ํ›„ 30๋ถ„ ์ด๋‚ด์— ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ „ํ™˜์œจ์„ ๊ณ„์‚ฐ.

  • ๊ณ„์ • ์ƒ์„ฑ(create_user)  ํ›„ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ(complete_signup) ์ „ํ™˜์œจ.
  • ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ(complete_signup) ํ›„ ํ™ˆํŽ˜์ด์ง€(home_page) ์ง„์ž…๋ฅ .
  • ํ™ˆํŽ˜์ด์ง€ ์ง„์ž…(home_page) ํ›„ ๋ฉ”์‹œ์ง€ ์ข‹์•„์š”(like_message) ํด๋ฆญ๋ฅ .
  • ํšŒ์›๊ฐ€์ž… ํ›„(complete_signup) ๋ฉ”์‹œ์ง€ ์ข‹์•„์š”(like_message) ํด๋ฆญ ์ „ํ™˜์œจ.

๐Ÿ’ก ๊ฒฐ๊ณผ: ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ „ํ™˜์œจ์„ ๋ฐฑ๋ถ„์œจ๋กœ ์‚ฐ์ถœ.

  • ์†Œ์ˆซ์  ๋‘˜์ž์งœ๋ฆฌ๊นŒ์ง€ ์ถœ๋ ฅ
  • ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ์ฒ˜์Œ ์œ ์ €๊ฐ€ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ ํ›„ 30๋ถ„ ์•ˆ์— ์™„๋ฃŒ๋˜์—ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๋ถ„๋ฅ ๋กœ ๊ตฌํ•ด์ฃผ์„ธ์š”.
๋”๋ณด๊ธฐ
WITH create_user AS
	(
	SELECT user_id,
		   MIN(occurred_at) AS occurred_at_create_user
	FROM Basic.yammer_events y1
	WHERE event_name = 'create_user'
	GROUP BY user_id
	),
	complete_signup AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_complete_signup
	FROM Basic.yammer_events y2
	WHERE event_name = 'complete_signup'
	GROUP BY user_id),
	home_page AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_home_page
	FROM Basic.yammer_events y3
	WHERE event_name = 'home_page'
	GROUP BY user_id),
	like_message AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_like_message
	FROM Basic.yammer_events y4
	WHERE event_name = 'like_message'
	GROUP BY user_id
	)
SELECT ROUND(COUNT(CASE WHEN occurred_at_complete_signup IS NOT NULL THEN 1 ELSE NULL END)
	   		/COUNT(*)*100.0,2) AS create_user_to_complete_signup,
	   ROUND(COUNT(CASE WHEN occurred_at_home_page IS NOT NULL THEN 1 ELSE NULL END)
	   		/COUNT(CASE WHEN occurred_at_complete_signup IS NOT NULL THEN 1 ELSE NULL END)*100.0,2) AS complete_signup_to_homepage,
	   ROUND(COUNT(CASE WHEN occurred_at_like_message IS NOT NULL THEN 1 ELSE NULL END)
	   		/COUNT(CASE WHEN occurred_at_home_page IS NOT NULL THEN 1 ELSE NULL END)*100.0, 2) AS homepage_to_like_message,
	   ROUND(COUNT(CASE WHEN occurred_at_like_message IS NOT NULL THEN 1 ELSE NULL END)
	   		/COUNT(CASE WHEN occurred_at_complete_signup IS NOT NULL THEN 1 ELSE NULL END)*100.0,2) AS complete_signup_to_like_message
FROM create_user cu 
	LEFT JOIN complete_signup cs ON cu.user_id = cs.user_id
	LEFT JOIN home_page hp ON cu.user_id = hp.user_id
	LEFT JOIN like_message lm ON cu.user_id = lm.user_id
WHERE occurred_at_complete_signup IS NULL
	  OR occurred_at_home_page IS NULL
	  OR occurred_at_like_message IS NULL
	  OR TIMESTAMPDIFF(HOUR, occurred_at_create_user, occurred_at_like_message) <= 0.5;

[์‹ฌํ™”] ๊ณผ์ œ 4. ์ผ๋ณ„๋กœ ํšŒ์› ๊ฐ€์ž… ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ ๋‹จ๊ณ„ ์™„๋ฃŒ ํ‰๊ท  ์‹œ๊ฐ„

๐Ÿ“Œ ๋ชฉํ‘œ: ์œ ์ €๊ฐ€ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ ํ›„ 30๋ถ„ ์ด๋‚ด์— ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ „ํ™˜์œจ์„ ๊ณ„์‚ฐ.

  • ๊ณ„์ • ์ƒ์„ฑ (create_user) ํ›„ ์ด๋ฉ”์ผ ์ž…๋ ฅ ํ™”๋ฉด ์ง„์ž…(enter_email)๊นŒ์ง€.
  • ์ด๋ฉ”์ผ ์ž…๋ ฅ ํ™”๋ฉด ์ง„์ž…(enter_email) ํ›„ ๊ฐœ์ธ ์ •๋ณด ์ž…๋ ฅ ํ™”๋ฉด ์ง„์ž…(enter_info)๊นŒ์ง€.
  • ๊ฐœ์ธ ์ •๋ณด ์ž…๋ ฅ ํ™”๋ฉด ์ง„์ž…(enter_info) ํ›„ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ(complete_signup)๊นŒ์ง€.
  • ๊ณ„์ • ์ƒ์„ฑ (create_user) ํ›„ ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ(complete_signup)๊นŒ์ง€.

๐Ÿ’ก ๊ฒฐ๊ณผ: ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ „ํ™˜์œจ์„ ๋ฐฑ๋ถ„์œจ๋กœ ์‚ฐ์ถœ.

  • ์†Œ์ˆซ์  ๋‘˜์ž์งœ๋ฆฌ๊นŒ์ง€ ์ถœ๋ ฅ
  • ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ์ฒ˜์Œ ์œ ์ €๊ฐ€ ๊ณ„์ •์„ ์ƒ์„ฑํ•œ ํ›„ 30๋ถ„ ์•ˆ์— ์™„๋ฃŒ๋˜์—ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๋ถ„๋ฅ ๋กœ ๊ตฌํ•ด์ฃผ์„ธ์š”.
๋”๋ณด๊ธฐ
WITH create_user AS
	(
	SELECT location,
		   device,
		   user_id,
		   MIN(occurred_at) AS occurred_at_create_user
	FROM Basic.yammer_events y1
	WHERE event_name = 'create_user'
	GROUP BY location, device, user_id
	),
	complete_signup AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_complete_signup
	FROM Basic.yammer_events y2
	WHERE event_name = 'complete_signup'
	GROUP BY user_id),
	enter_email AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_enter_email
	FROM Basic.yammer_events y3
	WHERE event_name = 'enter_email'
	GROUP BY user_id),
	enter_info AS
	(
	SELECT user_id, MIN(occurred_at) AS occurred_at_enter_info
	FROM Basic.yammer_events y4
	WHERE event_name = 'enter_info'
	GROUP BY user_id)
SELECT ROUND(AVG(TIMESTAMPDIFF(SECOND, occurred_at_create_user,occurred_at_enter_email)),2) AS create_user_to_enter_email_AVG,
	   ROUND(AVG(TIMESTAMPDIFF(SECOND, occurred_at_enter_email,occurred_at_enter_info)),2) AS enter_email_to_enter_info_AVG,
	   ROUND(AVG(TIMESTAMPDIFF(SECOND, occurred_at_enter_info,occurred_at_complete_signup)),2)enter_info_to_complete_signup_AVG,
	   ROUND(AVG(TIMESTAMPDIFF(SECOND, occurred_at_create_user,occurred_at_complete_signup)),2)create_user_to_complete_signup_AVG
FROM create_user cu 
	LEFT JOIN enter_email ee ON cu.user_id = ee.user_id
	LEFT JOIN enter_info ei ON cu.user_id = ei.user_id
	LEFT JOIN complete_signup cs ON cu.user_id = cs.user_id
WHERE occurred_at_enter_email IS NULL 
	  OR occurred_at_enter_info IS NULL
	  OR occurred_at_complete_signup IS NULL 
	  OR DATEDIFF(occurred_at_complete_signup, occurred_at_create_user) <= 1;


 

Funnels with SQL: The good, the bad and the ugly way

Writing funnel queries in SQL is a complex task. There are multiple approaches one can take. However, each of them has its benefits and drawbacks. This post explores three approaches you may copy for your next data analytics project.

www.mitzu.io