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