What a Beautiful Data!

SQL 데이터 분석 캠프 실전반 전환율 (퍼널 분석)

by darami
  • 서브 쿼리로 풀다보니 서브 쿼리의 서브 쿼리,,,, 이런식으로 너무 복잡해질 것 같아 WITH를 쓰기로 했다.
  • 저번 스터디 시간에 들은 건데, WITH가 현업에서 가독성도 좋고 성능도 좋아 많이 선호된다고 한다.
  • WITH 함께 뿌셔뿌셔~

 

우선 이렇게 각 컬럼에서 사용할 조건들을 각각 테이블로 만들어 준다.

WITH pv AS (
SELECT user_pseudo_id,ga_session_id,event_name_page_title
FROM ga
WHERE page_title= '백문이불여일타 SQL 캠프 실전반'
AND event_name = 'page_view'
),
scroll AS (
SELECT user_pseudo_id,ga_session_id,event_name_page_title
FROM ga
WHERE page_title= '백문이불여일타 SQL 캠프 실전반'
AND event_name = 'scroll'
) ,
click AS (
SELECT user_pseudo_id,ga_session_id,event_name_page_title
FROM ga
WHERE event_name = 'SQL_advanced_form_click'
),
  • 처음에는 SELECT DISTINCT ( user_pseudo_id,ga_session_id) 이렇게 디스팅트를 해 줘야 하니까 with 절을 쓰는게 고민 되었는데, 사실 테이블을 호출해줄 수 있으니까 괜한 고민이었던 것이다.! 
  • 와...중간에 에러날 게 없는데 왜지..하고 계속 들여다 봤는데 역시 오타.......!!!  

오타는 안보이면 죽어도 안보이곤 한다. 전혀 문제가 없는 것 같으면 다시 한번 오타...검사...

코드가 길어질수록 오타... (scorll이 아니라 scroll!!!!!) 

맞춘 정답 풀이

WITH pv AS (
SELECT user_pseudo_id,ga_session_id,event_name,page_title
,event_timestamp_kst
FROM ga
WHERE page_title= '백문이불여일타 SQL 캠프 실전반'
AND event_name = 'page_view'
)
,scroll AS (
SELECT user_pseudo_id,ga_session_id,event_name,page_title
,event_timestamp_kst
FROM ga
WHERE page_title= '백문이불여일타 SQL 캠프 실전반'
AND event_name = 'scroll'
)
,click AS (
SELECT user_pseudo_id,ga_session_id,event_name,page_title
,event_timestamp_kst
FROM ga
WHERE event_name = 'SQL_advanced_form_click'
)
SELECT pv
,scroll_after_pv
,click_after_scroll
,ROUND((scroll_after_pv/pv),3)pv_scroll_rate
,ROUND((click_after_scroll/pv),3)pv_click_rate
,ROUND((click_after_scroll / scroll_after_pv),3)scroll_click_rate
FROM
(SELECT COUNT(DISTINCT pv.user_pseudo_id,pv.ga_session_id)pv
,COUNT(DISTINCT scroll.user_pseudo_id,scroll.ga_session_id)scroll_after_pv
,COUNT(DISTINCT click.user_pseudo_id,click.ga_session_id)click_after_scroll
FROM pv
LEFT JOIN scroll ON pv.user_pseudo_id=scroll.user_pseudo_id
AND pv.ga_session_id=scroll.ga_session_id
AND scroll.event_timestamp_kst >= pv.event_timestamp_kst
LEFT JOIN click ON pv.user_pseudo_id=click.user_pseudo_id
AND pv.ga_session_id=click.ga_session_id
AND click.event_timestamp_kst >= scroll.event_timestamp_kst
)p

 

 

인사이트 

  • WITH a AS(), WITH b AS() 이렇게 안쓰고 WITH a as(), b() 이렇게 써도 된다! 앞에 with가 받아준다. 
  • 테이블을 여러개 만들 때, 각 테이블 값의 속성으로 간단하게 만들어 외우지 않아도 되게 만들기 
  • DISTINCT 잡아줘야하니까 조인 조건 여러개 걸기 
  • LEFT JOIN으로 조건 잘라서 걸어주니까 SELECT절에 과도한 부담이 가지 않아 성능에 좋다. 
  • From절 서브쿼리 하나라서 테이블 호출 안해주더라도 이름은 지어주는거 명심 
  • 오타 주의~ 자나 깨나 오타 확인~
블로그의 프로필 사진

블로그의 정보

다람

darami

활동하기