묻고 답해요
139만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-11 현황 파악 분석하기
현황 파악하기 링크 다시 올립니다!피드백 부탁드립니다~https://cliff-wrinkle-1f0.notion.site/FOODIE-APP-0186b8e16c164701afc3d7afd66a551f
-
미해결BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-11. 현황 파악하기
https://www.notion.so/FOODIE-APP-0186b8e16c164701afc3d7afd66a551f?pvs=4현황 파악해봤습니다! 피드백 부탁드립니다~
-
미해결BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-13. 리텐션 분석 과제
"3-13. 리텐션 과제 : 꼭 풀어보시고 제출해주세요" 강의 과제 완료하여 제출 합니다. 링크 : 리텐션 분석 과제 "쿼리 검토 요청"이라고 기재되어 있는 부분 쿼리에 이상이 없는지 확인해주시면 감사하겠습니다!그리고 과제하다가 궁금한 점이 있어 "문의사항"도 남겨두었습니다. 해당 부분도 답변 부탁드립니다! 전반적으로 리텐션 분석을 진행하는 과정이 올바른지에 대해서도 피드백을 주시면 많은 도움이 될 것 같습니다! 강의를 통해 정말 많이 배울 수 있었습니다!감사합니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-9. 퍼널 SQL 쿼리 작성하기
강의 보면서 '퍼널별 유저 수 집계' 쿼리 작성했는데 결과값이 올바르게 나오지 않아요... 어디서 잘못 되었을까요?WITH base AS( SELECT event_date, event_name, DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') as event_timestamp, event_param, user_id, user_pseudo_id, platform, -- event_parma.key PIVOT MAX(IF(event_param.key='firebase_screen',event_param.value.string_value,null)) AS firebase_screen, -- MAX(IF(event_param.key='food_id',event_param.value.int_value,null)) AS food_id, MAX(IF(event_param.key='session_id',event_param.value.string_value,null)) AS session_id FROM advanced.app_logs CROSS JOIN UNNEST(event_params) as event_param GROUP BY ALL) -- event_name + screen (필요한 이벤트만 where 조건에 걸어서 사용) ,filter_event as( SELECT * except(event_name,firebase_screen), concat(event_name,'-',firebase_screen) AS event_name_with_screen FROM base WHERE event_name in ('screen_view','click_payment')) SELECT event_name_with_screen, -- step_number case when event_name_with_screen='screen_view-welcome' then 1 when event_name_with_screen='screen_view-home' then 2 when event_name_with_screen='screen_view-food_category' then 3 when event_name_with_screen='screen_view-restaurant' then 4 when event_name_with_screen='screen_view-cart' then 5 when event_name_with_screen='click_pavement-cart' then 6 else null end AS Step_number, count(DISTINCT user_pseudo_id) as cnt FROM filter_event GROUP BY ALL HAVING step_number IS NOT NULL
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[과제] 퍼널 쿼리(피벗테이블 적용) 작성
# base 쿼리 작성 전 생각 흐름 ---------------------------------------------------- ## 1. 테이블 내 데이터 구조 파악 -- select -- * -- from advanced.app_logs -- where -- event_date = '2022-08-01' -- 목적에 맞는 쿼리를 기존 데이터로 구현할 수 있는지 여부 확인 -- 연습문제 결과물 컬럼인 'event_name_with_screen', 'step_number', 'cnt'는 기존 컬럼에 없음. -- 기존 컬럼에 없기 때문에 해당 컬럼을 어떻게 구현해내야 할 지 생각해보기 ## 2. event_name_with_screen 컬럼 구현 순서 및 방법 -- event_name_with_screen는 다음과 같은 value를 가짐 -- 1. screen_view-welcome -- 2. screen_view-home -- 3. screen_view-food_vategory -- 4. screen_view-restaurant -- 5. screen_view-cart -- 6. click_payment-cart -- 위 6가지 value가 기존 컬럼에 있는지 확인해보기 -- 있는 경우 -- 기존 컬럼 활용 -- 없는 경우 -- concat 등으로 새롭게 구현 -- 연습문제에서는 event_name과 event_params.key에 있는 value를 concat 했음. -- event_params.key는 데이터타입이 struct이기 때문에 unnest 필요. -- select -- event_name, -- unnest_event_params -- from advanced.app_logs -- cross join unnest(event_params) as unnest_event_params -- where -- event_date = '2022-08-01' -- unnest 결과물에 피봇테이블 적용하기 -- 피봇테이블로 만들면 직관적으로 event_name과 concat 하기가 용이해서. -- select -- event_name, -- event_date, -- event_timestamp, -- user_pseudo_id, -- max(if(unnest_event_params.key = 'firebase_screen', unnest_event_params.value.string_value, null)) as firebase_screen, -- max(if(unnest_event_params.key = 'food_id', unnest_event_params.value.int_value, null)) as food_id, -- max(if(unnest_event_params.key = 'session_id', unnest_event_params.value.string_value, null)) as session_id -- from advanced.app_logs -- cross join unnest(event_params) as unnest_event_params -- where event_date between '2022-08-01' and '2022-08-18' -- group by 1, 2, 3, 4 ---------------------------------------------------- with base as ( select event_name, event_date, event_timestamp, user_pseudo_id, max(if(unnest_event_params.key = 'firebase_screen', unnest_event_params.value.string_value, null)) as firebase_screen, max(if(unnest_event_params.key = 'food_id', unnest_event_params.value.int_value, null)) as food_id, max(if(unnest_event_params.key = 'session_id', unnest_event_params.value.string_value, null)) as session_id from advanced.app_logs cross join unnest(event_params) as unnest_event_params where event_date between '2022-08-01' and '2022-08-18' group by 1, 2, 3, 4 ), base2 as ( select *, concat(event_name, '-', firebase_screen) as event_name_with_screen from base ) ## 일자별 퍼널 쿼리 , base3 as (select event_date, event_name_with_screen, # 2개 이상 조건을 한 개 컬럼에 적용해야 하기 때문에 case when 사용 case when event_name_with_screen = 'screen_view-welcome' then 1 when event_name_with_screen = 'screen_view-home' then 2 when event_name_with_screen = 'screen_view-food_category' then 3 when event_name_with_screen = 'screen_view-restaurant' then 4 when event_name_with_screen = 'screen_view-cart' then 5 when event_name_with_screen = 'click_payment-cart' then 6 else null end as step_number, # 중복되지 않은 사용자수(비로그인 이용자까지)를 파악하기 위해서 count(distinct 컬럼명) 사용 count(distinct user_pseudo_id) as cnt from base2 group by all # null 값 제외하기 위해서 그룹에 필터링 거는 having 사용 having step_number is not null # 1일부터 보고 싶기 때문에 오름차순(asc) 적용 order by 1 asc) ## 일자별 쿼리 (피벗테이블 적용) select event_date, max(if(event_name_with_screen = 'screen_view-welcome', cnt, 0)) as screen_view_welcome, max(if(event_name_with_screen = 'screen_view-home', cnt, 0)) as screen_view_home, max(if(event_name_with_screen = 'screen_view-food_category', cnt, 0)) as screen_view_food_category, max(if(event_name_with_screen = 'screen_view-restaurant', cnt, 0)) as screen_view_restaurant, from base3 group by all order by 1 asc
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-6. 데이터 PIVOT 연습문제
빅쿼리 날짜 타입 입력할때 큰따옴표, 작은 따옴표 둘 중에 아무거나 입력해도 상관없을까요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-4 ARRY ,STRUCT 연습문제
어느 부분에서 오류 났는지 모르겠어요!
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-2. 데이터 불러오기 질문
app_logs_temp 테이블 생성할 때 바로 event_date로 파티션 설정할 수 없을까요? app_logs 테이블 생성할 때 쿼리 이해가 잘 되지 않아요, 설정에서 테이블 만들기와의 차이점이 무엇인가요?
-
미해결시작하는 마케터를 위한 디지털마케팅 펀더멘탈 D.I.M.A
PPT자료
선생님 강의 PPT 자료 다운로드 받을 수 없을까요? 노션에는 강의 PPT 자료는 없어서요!
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-8. Google Sheets로 Retention Curve 시각화하기 질문
안녕하세요 강사님ctrl + A를 해도 전체 화면이 선택이 안되는 것 같습니다.삽입 목록도 클릭이 안되게 막혀있습니다!해결 방법이 궁금합니다 :)
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
최종 과제 제출
안녕하세요. 최종 과제 노션으로 작성해서 링크 공유드립니다.감사합니다!https://staticstic.notion.site/9c91ee729d734edeb5a85cc8fa6bf2b6?pvs=4
-
미해결시작하는 마케터를 위한 디지털마케팅 펀더멘탈 D.I.M.A
마케팅 대시보드 구성 문의
1) 안녕하세요! 강의 듣고 루커스튜디오로 마케팅 대시보드를 구성해봤는데요! 문의가 있어서 질문드립니다. 샘플 데이터로 주신 GPT Created law 파일로 대시보드는 구성했는데요! CVR을 표에 추가로 표기 하고 싶은데, 계산된 필드추가에 sum(구매자수)/sum(clicks)으로 계산된 필드를 활용하면 될까요? 2) 강의 듣고 GA4 자격도 취득 했는데! 이력서에 공식적으로 활용할 수 있을까요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
퍼널 분석
강사님 안녕하세요,섹션4 리텐션 분석 들어가기 전에 app_logs 데이터 가지고 퍼널분석을 진행해 보았습니다!https://www.notion.so/de12e9d1d9fd4e9595cee4ddd5f5c6cf?pvs=4
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
결제계정 등록했는데도 불구하고 app_logs 테이블에 데이터가 존재하지 않습니다
무료 체험판이 만료되어서 결제 계정을 활성화시켰습니다.그런데 app_logs 테이블에 데이터가 존재하지 않습니다.어떻게 해결해야 할까요 궁금합니다...!
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
리텐션 과제 작성
안녕하세요. 리텐션 과제 작성하여 노션 링크 첨부하였습니다.제가 다른 분야에서 업무를 하다가 앱 로그 데이터를 처음 다뤄보게 되었는데 어려운 점이 많네요.. ㅠ 과제를 진행하면서 모르겠는 점도 있고 해서 먼저 피드백을 받고 다시 진행해보려고 합니다.좋은 강의 만들어주셔서 감사합니다!https://www.notion.so/staticstic/880f80adb2d7414e8cfa417512b263d4?pvs=4
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-7. Weekly 리텐션 쿼리 작성 및 질문
안녕하세요.Weekly로 리텐션 쿼리 아래와 같이 작성해 보았습니다.한가지 질문할 점은 event_week 기간 동안 한번 이상 접속을 한다고 하더라도 user_psuedo_id는 한번으로 집계되는지 궁금합니다!그리고 작성한 쿼리문을 좀 더 나은 방향으로 수정하면 좋은 방향이 있다면 언제든 말씀 부탁드릴께요! 강의 정말 잘 듣고 있습니다 :)===작성한 쿼리문===WITH base AS ( SELECT DISTINCT user_id, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul")) AS event_date, user_pseudo_id FROM advanced.app_logs WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), diff_of_week_data AS ( SELECT *, DATE_DIFF(event_week, first_week, week) AS diff_of_week FROM( SELECT DISTINCT user_pseudo_id, MIN (DATE_TRUNC(event_date,WEEK(MONDAY))) OVER (PARTITION BY user_pseudo_id) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ) SELECT *, SAFE_DIVIDE(cnt, first_value_cnt) AS retention_ratio FROM( SELECT *, FIRST_VALUE(cnt) OVER (ORDER BY diff_of_week) AS first_value_cnt FROM( SELECT diff_of_week, COUNT(user_pseudo_id) AS cnt FROM diff_of_week_data GROUP BY diff_of_week ) ) ORDER BY diff_of_week
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
리텐션 분석 과제
리텐션 분석 과제 노션 문서에 정리해서 공유드립니다~문서 링크
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-13 4번 문제 풀어보았습니다
4. Core Event를 "click_payment"라고 설정하고 Weekly Retention을 구해주세요. WITH base AS( SELECT event_date, event_timestamp, user_pseudo_id, event_name, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen, MAX(IF(ep.key = 'food_id', ep.value.int_value, NULL)) AS food_id, MAX(IF(ep.key = 'session_od', ep.value.string_value, NULL)) AS session_od FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep GROUP BY ALL ), payment AS( SELECT user_pseudo_id, event_timestamp, event_date, event_name, --firebase_screen, FROM base WHERE event_name = 'click_payment' ORDER BY event_date ), payment_first_week AS( SELECT *, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM( SELECT * EXCEPT(event_timestamp, event_date), DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date FROM payment ) ), payment_user_cnt AS( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM payment_first_week ) GROUP BY diff_of_week ORDER BY diff_of_week ) ############################### 리텐션 비율 구하기 ############################### SELECT *, SAFE_DIVIDE(user_cnt, first_week_user_cnt) AS retention_rate FROM( SELECT *, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week) AS first_week_user_cnt FROM payment_user_cnt ) 여기까지는 payment 테이블 WHERE절에 event_name으로 "click_payment" 조건을 걸어준 것 빼곤 강의의 코드를 거의 그대로 사용했습니다. 결과는 이렇게 나왔고, 저는 diff_of_week가 4일 때 갑자기 user_cnt가 상승했다가 5일 때 다시 이전 수치로 돌아간 것에 주목했습니다(약 18% 상승). SELECT event_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM payment_first_week ) WHERE diff_of_week = 4 GROUP BY event_week ORDER BY user_cnt DESC 그래서 diff_of_week가 4일 때의 "click_payment" 이벤트를 발생시킨 유저의 수를 추출해보았습니다. 결과를 보았을 때, 2022-10-31 ~ 2023-01-09의 유저 수가 많음을 확인하였고 이는, 해당 기간이 첫 주문 후 4주가 지난 사람들의 재주문 건수가 많았을 것이라는 생각이 들었습니다. ##################### 해당 날짜, 이전, 이후의 데이터 추출 #################### # target_date 테이블: 해당 날짜를 만족하는 행만 추출 , target_date AS( SELECT * FROM base WHERE user_pseudo_id IN( SELECT user_pseudo_id FROM payment_first_week WHERE first_week BETWEEN '2022-10-03' AND '2022-12-12' ) ORDER BY user_pseudo_id, event_timestamp # before_target_date 테이블: 해당 날짜 이전 ), before_target_date AS( SELECT * FROM base WHERE user_pseudo_id IN( SELECT user_pseudo_id FROM payment_first_week WHERE first_week BETWEEN '2022-08-01' AND '2022-10-02' ) ORDER BY user_pseudo_id, event_timestamp # after_target_date 테이블: 해당 날짜 이후 ), after_target_date AS( SELECT * FROM base WHERE user_pseudo_id IN( SELECT user_pseudo_id FROM payment_first_week WHERE first_week BETWEEN '2022-12-13' AND '2023-12-31' ) ORDER BY user_pseudo_id, event_timestamp ) ################ click_payment를 발생시킨 유저와 그 때의 날짜 추출 ################ # payment_users 테이블: 해당 날짜에서 event_name칼럼에 "click_payment"를 가지고 있는 user_pseudo_id와 그 때의 event_date를 추출 , payment_users_target_date AS( SELECT event_date, user_pseudo_id FROM( SELECT *, CASE WHEN event_name = 'click_payment' THEN 1 ELSE 0 END AS payment_user FROM target_date ) WHERE payment_user = 1 ) # payment_users_before 테이블: 해당 날짜 이전의 payment user의 정보 ,payment_users_before AS( SELECT event_date, user_pseudo_id FROM( SELECT *, CASE WHEN event_name = 'click_payment' THEN 1 ELSE 0 END AS payment_user FROM before_target_date ) WHERE payment_user = 1 ) # payment_users_after 테이블: 해당 날짜 이후의 payment user의 정보 ,payment_users_after AS( SELECT event_date, user_pseudo_id FROM( SELECT *, CASE WHEN event_name = 'click_payment' THEN 1 ELSE 0 END AS payment_user FROM after_target_date ) WHERE payment_user = 1 ) 그래서 전체 날짜를 위의 해당 날짜와 그 전, 후 3개로 나누어 해당 기간의 정보만을 담는 테이블을 생성하고, 각 기간에 "click_payment" 이벤트를 가지고 있는 유저의 user_pseudo_id와 그 때의 event_date를 추출하였습니다.################ 3개의 기간동안 사람들이 주문한 음식의 food_id 추출 ################ # 해당 기간동안 사람들이 주문한 food_id , food_cnt_target_date AS( SELECT food_id, COUNT(*) AS food_cnt FROM target_date td JOIN payment_users_target_date pu ON td.user_pseudo_id = pu.user_pseudo_id AND td.event_date = pu.event_date WHERE event_name = "click_cart" GROUP BY food_id ORDER BY food_cnt DESC --ORDER BY td.user_pseudo_id, event_timestamp ), # 해당 기간 이전 사람들이 주문한 food_id food_cnt_before_target AS( SELECT food_id, COUNT(*) AS food_cnt FROM before_target_date td JOIN payment_users_before pu ON td.user_pseudo_id = pu.user_pseudo_id AND td.event_date = pu.event_date WHERE event_name = "click_cart" GROUP BY food_id ORDER BY food_cnt DESC ), # 해당 기간 이후 사람들이 주문한 food_id food_cnt_after_target AS( SELECT food_id, COUNT(*) AS food_cnt FROM after_target_date td JOIN payment_users_after pu ON td.user_pseudo_id = pu.user_pseudo_id AND td.event_date = pu.event_date WHERE event_name = "click_cart" GROUP BY food_id ORDER BY food_cnt DESC ) 위에서 구한 id와 date를 이용해 세 기간동안 사람들이 주문한 음식과 음식 별 건수를 추출하였습니다. 전체 데이터를 살펴본 결과, "click_payment"는 항상 주문 마지막에 발생하는 이벤트이며, 이 row에는 food_id는 없고, "click_cart" 이벤트를 발생시켰을 때 해당 주문건에 대한 food_id가 row에 포함되어 있어 event_name을 "click_cart"로 지정하였습니다. ################ 각 food_id 별 해당 기간, 이전, 이후의 주문 건수 카운트 ################ , total_cnt AS( SELECT td.food_id, btd.food_cnt AS food_cnt_before_target_date, td.food_cnt AS food_cnt_target_date, atd.food_cnt AS food_cnt_after_target_date FROM food_cnt_target_date td JOIN food_cnt_before_target btd ON td.food_id = btd.food_id JOIN food_cnt_after_target atd ON td.food_id = atd.food_id ) ################ 각 food_id 별 해당 기간, 이전, 이후의 주문 건수 비율 ################ SELECT food_id, food_cnt_before_target_date, ROUND(SAFE_DIVIDE(food_cnt_before_target_date, SUM(food_cnt_before_target_date) OVER()), 4) AS rate_before, food_cnt_target_date, ROUND(SAFE_DIVIDE(food_cnt_target_date, SUM(food_cnt_target_date) OVER()), 4) AS rate_target, food_cnt_after_target_date, ROUND(SAFE_DIVIDE(food_cnt_after_target_date, SUM(food_cnt_after_target_date) OVER()), 4) AS rate_after FROM total_cnt ORDER BY rate_target DESC세 기간동안 사람들이 주문한 food_id와 그 횟수, 비율을 구해보았습니다. 각 음식의 비율은 매우 적지만 target_date를 기준으로 정렬해 보았을 때, 확실히 해당 기간동안 주문량이 높고 나머지 기간에는 주문량이 낮은 음식들이 존재했습니다(ex. 1438, 1516 등). 하지만, 이것이 4주전 주문자들의 실제 재주문 결과인지, 단지 해당기간 동안 신규 유저가 늘었기 때문인지 확실하지 않다고 생각문자와 그 외 기간동안의 신규 주문자를 비교해 보았습니다. SELECT new_user_target_date, COUNT(*) AS new_user_cnt FROM( SELECT CASE WHEN first_week BETWEEN '2022-10-31' AND '2023-01-09' THEN 1 ELSE 0 END AS new_user_target_date FROM payment_first_week ) GROUP BY new_user_target_date 해당 기간의 신규 유저수는(new_user_target_date = 1) 6261명, 그 외 기간의 신규 유저수는 6898명으로, 전체 기간 대비 해당 기간의 비율을 고려해보았을 때, 신규 유저가 크게 늘었다고 보기 어려웠습니다. 따라서, 2022~10-03 ~ 2022-12-12일이 포함된 주차에 첫 주문을 한 고객들의 만족도가 높았거나, 그 당시에 시행했던 첫 주문 관련 마케팅, 광고 효과가 좋았을 것이라고 판단할 수 있었습니다. ** 앱 로그 데이터를 처음 접했기 때문에 코드 오류나 논리적인 비약이 있을 것이라고 생각하지만, 단지 Weekly Retention에 WHERE 조건을 추가하는 것에 그치기 아쉬워서(?) 의식의 흐름대로 분석해보았습니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-7. 리텐션 쿼리 작성해보기(Weekly, Montly)
Weekly 리텐션 분석#Weekly 리텐션 with base as ( select distinct user_id, user_pseudo_id, event_name, date(datetime(timestamp_micros(event_timestamp), "Asia/Seoul")) as event_date, datetime(timestamp_micros(event_timestamp), "Asia/Seoul") as event_datetime, from `advanced.app_logs` where event_date between "2022-08-01" and "2022-11-03" ), retain_base as ( select user_pseudo_id, event_week, first_week, date_diff(event_week, first_week, week) as diff_of_week from ( select distinct user_pseudo_id, date_trunc(event_date, week(monday)) as event_week, date_trunc(min(event_date) over(partition by user_pseudo_id),week(monday)) as first_week, -- 유저의 첫 접속 주차 from base ) ) select diff_of_week, user_cnt, first_value(user_cnt) over(order by diff_of_week) as first_user_cnt from ( select diff_of_week, count(distinct user_pseudo_id) as user_cnt from retain_base group by diff_of_week ) order by diff_of_week Montly 리텐션 분석#Montly 리텐션 with base as ( select distinct user_id, user_pseudo_id, event_name, date(datetime(timestamp_micros(event_timestamp), "Asia/Seoul")) as event_date, datetime(timestamp_micros(event_timestamp), "Asia/Seoul") as event_datetime, from `advanced.app_logs` where event_date between "2022-08-01" and "2022-11-03" ), retain_base as ( select user_pseudo_id, event_month, first_month, date_diff(event_month, first_month, month) as diff_of_month from ( select distinct user_pseudo_id, date_trunc(event_date, month) as event_month, date_trunc(min(event_date) over(partition by user_pseudo_id),month) as first_month, -- 유저의 첫 접속 주차 from base ) ), month_retain as ( select diff_of_month, user_cnt, first_value(user_cnt) over(order by diff_of_month) as first_user_cnt from ( select diff_of_month, count(distinct user_pseudo_id) as user_cnt from retain_base group by diff_of_month ) ) select diff_of_month, user_cnt, first_user_cnt, round(safe_divide(user_cnt, first_user_cnt),3) as retention_rate from month_retain order by diff_of_month 위클리랑 먼슬리 리텐션 쿼리 작성했습니다~
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
FRAME 연습 마지막 AVG 문제 소수점에 대하여 여쭤볼게 있습니다!
문제풀이를 해가던 도중마지막 ROWS BETWEEN을 이용한 5가지 AMOUNT의 AVG를 구할때 소수점이 나오는데SELECT절에 적힌 WINDOW 함수 쿼리를ROUND, FLOOR 을 사용해서 감싸줘도 작동은 하지만 소수점이 사라지지 않는데 혹시 그 이유가 뭔가요???