묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
최종 과제 제출
안녕하세요, 로그를 분석해서 글로 작성해보았습니다.혹시 가능하시다면 한번 보시고 개선하면 좋을 점을 알려주시면 공부를 이어가는 데 많은 도움이 될 것 같습니다!🙇♂노션 페이지 링크 남깁니다.https://www.notion.so/inflearn-app_logs-24eceb39ae70805f81abfee9aa86ebc2?source=copy_link고민되었던 부분장황하게 이것저것 설명은 했지만, 결국 도출한 결론은 '결제 경험이 있는 사용자의 재방문을 발생시켜서 결제 건수를 높여보자 ' 입니다. 재방문 사용자가 유입되도록 하고 행동을 지켜보자는 것인데,, 이러한 액션이 특별히 효과적일 것이라는 것을 로그로부터 미리 확인할 수 있는 방법이 있을까요..?구체적으로 어떤 집단에 액션을 수행하자는 결론을 도출하고 싶었는데 잘 되지 않은 것 같습니다
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
weekly retention 구하기 과제
weekly retention 구하기 과제 해 봤습니다. 처음에 알려주신대로 두 가지 방법 1) EXTRACT 과 2) DATA_TRUNC 을 써서 각각 해 봤는데 일을 자르는 기준이 달라서 그런지 첫 데이터는 값이 같은데 1주가 차이나는 시점부터 데이터들의 값이 미세하게 차이가 나더라구요.그리고 차이를 계산할 때도 INT 타입이라 DIFF_DATE 대신 그냥 컬럼끼리 빼는 방법으로 계산해야 됐습니다. 만약 이게 동일 년도 내에서만 해야하는 분석이라면 어떤 방법이 더 좋은지 궁금합니다. 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 `advance.app_logs` WHERE event_date BETWEEN '2022-08-01' AND '2022-11-03' ) , first_week_data AS( SELECT *, MIN(week_date) OVER(PARTITION BY user_pseudo_id) AS first_week FROM ( SELECT user_pseudo_id, event_date, -- DATETIME_TRUNC(DATE(event_date), WEEK(MONDAY)) AS week_date, EXTRACT(WEEK FROM event_date) AS week_date FROM base ) ), week_diff_data AS ( SELECT *, -- DATE_DIFF(week_date, first_week, WEEK) AS week_diff (week_date-first_week) AS week_diff FROM first_week_data ), first_week_value_data AS( SELECT *, FIRST_VALUE(user_cnt) OVER (ORDER BY week_diff) AS first_week_value FROM( SELECT week_diff, COUNT(DISTINCT user_pseudo_id) AS user_cnt, FROM week_diff_data GROUP BY ALL) ORDER BY week_diff ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_value),3) AS retention FROM first_week_value_data
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-9. 피벗 쿼리 작성
안녕하세요.수업 잘 듣고 있습니다. 말씀 해 주신대로 풀이 보기 전에 풀어보고 다시 영상보고하니 재미도 있고 실력도 빨리 느는 것 같아요. 감사합니다! 1-9 강의에서 주신 피벗 쿼리 작성해 봤습니다! WITH funnel_base AS ( SELECT event_date, event_timestamp, event_name, -- params.key AS key, -- params.value.string_value AS string_value, -- params.value.int_value AS int_value, user_id, user_pseudo_id, platform, MAX(IF(params.key="firebase_screen",params.value.string_value,NULL))AS firebase_screen, MAX(IF(params.key="session_id",params.value.string_value,NULL))AS session_id, -- MAX(IF(params.key="food_id",params.value.int_value,NULL))AS food_id FROM `advance.app_logs` CROSS JOIN UNNEST (event_params) AS params WHERE event_date BETWEEN "2022-08-01" AND "2022-08-18" GROUP BY ALL ), filter_event AS ( -- event_name+screen SELECT * EXCEPT(event_name, firebase_screen,event_timestamp), CONCAT(event_name,'-', firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp FROM funnel_base WHERE event_name IN ('screen_view', 'click_payment') ), funnel_step AS ( SELECT event_date, filter_event.event_name_with_screen, CASE WHEN filter_event.event_name_with_screen = 'screen_view-welcome' THEN 1 WHEN filter_event.event_name_with_screen = 'screen_view-home' THEN 2 WHEN filter_event.event_name_with_screen = 'screen_view-food_category' THEN 3 WHEN filter_event.event_name_with_screen = 'screen_view-restaurant' THEN 4 WHEN filter_event.event_name_with_screen = 'screen_view-cart' THEN 5 WHEN filter_event.event_name_with_screen = 'click_payment-cart' THEN 6 ELSE NULL END AS step_number, COUNT(user_pseudo_id) AS cnt FROM filter_event WHERE event_date BETWEEN "2022-08-01" AND "2022-08-15" GROUP BY ALL HAVING step_number IS NOT NULL) --3. event_name_with_screen 컬럼으로, 일자별로 count SELECT event_date, SUM(IF(funnel_step.event_name_with_screen = "screen_view-welcome", cnt, null)) AS `screen_view-welcome`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-home", cnt, null)) AS `screen_view-home`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-food_category", cnt, null)) AS `screen_view-food_category`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-restaurant", cnt, null)) AS `screen_view-restaurant`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-cart", cnt, null)) AS `screen_view-cart`, SUM(IF(funnel_step.event_name_with_screen = "click_payment-cart", cnt, null)) AS `click_payment-cart` FROM funnel_step GROUP BY ALL ORDER BY event_date
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
app_logs 테이블 생성 문제
안녕하세요, 수업 잘 듣고 있습니다. 실습 하려고 데이터셋 로드 하는 도중에 문제가 발생해서 혼자 해결해 보고자 했는데 잘 되지 않아 문의 드립니다. 어떤 강의를 들으면서 발생했나요?BigQuery (활용편) 어떤 문제가 생겼나요?강의대로 데이터 로드한 후 테이블 파티션 기준으로 나눠 새로운 테이블을 생성했지만 컬럼 명은 생성이 되었는데 테이블 내용 전체가 비어있습니다. 어떤 시도를 해보셨나요? 문제 해결을 위해 ARRAY+STRUCT형태가 아닌 다른 컬럼들만 뽑아 새로운 테이블을 생성했을 때는 제대로 새 테이블이 생성 됐는데 event_params 컬럼을 포함시키면 데이터 전체가 딸려오지 않았습니다. 위 그림처럼요, 어떤 쿼리를 사용했나요?환경이 어떻게 되나요?(윈도우, 맥 중 택1, 크롬 같은 웹브라우저 환경)맥입니다. 혼자 해결해보려고 했지만 강의 속도가 너무 지연되는 것 같아 문의 드립니다!
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
Weekly Retention 구하기 완성하였습니다.
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" ), first_week_and_diff AS( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT DISTINCT user_pseudo_id, 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 base ) ), user_count AS( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ORDER BY diff_of_week ), division_before AS( SELECT *, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week) AS first FROM user_count ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first),2) AS retention_rate FROM division_before
-
미해결14년차 마케터에게 배우는 데이터드리븐 디지털/퍼포먼스마케팅의 모든것
구글 시트 다운로드
안녕하세요, 혹시 구글 시트로 대시보드 만들 때 사용하는 스프레드 시트 파일은 어디서 받을 수 있을까요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료
강의 다 듣고, 마지막에 주신 계산하기 좋은 형태로 만드는 피벗테이블을 만들어 보았습니다. 코드에 대한 피드백이 있으시다면 알려주세요! 감사합니다.WITH base AS( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, platform, 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 WHERE event_date between "2022-08-01" and "2022-08-18" GROUP BY ALL ), filter_event_and_concat_event_and_screen AS ( SELECT * EXCEPT(event_name, firebase_screen, event_timestamp), CONCAT(event_name, "-", firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM base WHERE event_name IN ("screen_view", "click_payment") ), pivot1 AS( SELECT event_date, event_name_with_screen, 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 user_pseudo_id) AS cnt FROM filter_event_and_concat_event_and_screen GROUP BY ALL HAVING step_number IS NOT NULL ORDER BY event_date, step_number ASC ) # 피벗 한번 더 돌려서 계산 쉽게 할 수 있는 테이블 형태 만들기 SELECT event_date, MAX(IF(event_name_with_screen = 'screen_view-welcome', cnt, NULL)) AS `screen_view-welcome`, MAX(IF(event_name_with_screen = 'screen_view-home', cnt, NULL)) AS `screen_view-home`, MAX(IF(event_name_with_screen = 'screen_view-food_category', cnt, NULL)) AS `screen_view-food_category`, MAX(IF(event_name_with_screen = 'screen_view-restaurant', cnt, NULL)) AS `screen_view-restaurant`, MAX(IF(event_name_with_screen = 'screen_view-cart', cnt, NULL)) AS `screen_view-cart`, MAX(IF(event_name_with_screen = 'click_payment-cart', cnt, NULL)) AS `click_payment-cart` FROM pivot1 GROUP BY event_date ORDER BY 1;
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-7 Weekly, Monthly Retention 쿼리 작성
# WEEKLY Retention 쿼리 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" ),first_week_and_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff_of_week FROM ( SELECT DISTINCT user_pseudo_id, 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 base ) ), user_counts AS ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ORDER BY diff_of_week ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt),3) AS retention_rate FROM( SELECT diff_of_week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_week) AS first_week_user_cnt FROM user_counts ) # Monthly Retention 쿼리 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" ),first_month_and_diff AS ( SELECT *, DATE_DIFF(event_month, first_month, MONTH) AS diff_of_month FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), MONTH) AS first_month, DATE_TRUNC(event_date, MONTH) AS event_month FROM base ) ), user_counts AS ( SELECT diff_of_month, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_month_and_diff GROUP BY diff_of_month ORDER BY diff_of_month ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_month_user_cnt),3) AS retention_rate FROM( SELECT diff_of_month, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_of_month) AS first_month_user_cnt FROM user_counts )
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
정성 데이터 분석 방법 문의
카일스쿨님 안녕하세요, 사용자 VoC 나 SNS 등의 정성 데이터를 모아서 분석하는 방법이 있을까요?데이터 분석 관련해서는 아직 기초적인 지식도 없다보니 정성 데이터는 어떤 방법으로 분석하는지, 어떤 방법이 가장 효과적일지 궁금합니다!(정성 데이터를 분석해서 문제 정의의 근거로 사용하려는 목적입니다. SQL 초급 강의는 아직 수강 전입니다 🥹)
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
최종 과제 제출
안녕하세요!현재도 최종과제 피드백을 해주시는지 잘 모르겠으나,, 피드백 받아보고 싶어서, 최종 과제 제출해보겠습니다!3번 문제에서는 특히 생각처럼 인사이트가 안나와서 어려웠습니다.. ㅎㅎhttps://www.notion.so/Foodie-express-SQL-223249eb444480eca214ed420d3699a4?source=copy_link
-
미해결14년차 마케터에게 배우는 데이터드리븐 디지털/퍼포먼스마케팅의 모든것
GA4 세션 캠페인
똑같이 따라했는데도 GA4 세션 캠페인이 전혀 안뜨는데 어떻게 해야 나올까요?gpt한테 물어보고 설정바꿔봐도 utm_campaign이 없는건지 안되네요
-
미해결14년차 마케터에게 배우는 데이터드리븐 디지털/퍼포먼스마케팅의 모든것
주요 이벤트 등록
안녕하세요 강사님!주요 이벤트 등록 실습을 하고 있는데주요 이벤트칸에 기본 purchase 외에는직접 만든 이벤트가 뜨지 않습니다기존 실습까지는 문제 없이 따라한 상태입니다.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-6 예시 문제 풀이
질문을 남겨주실 때 아래 부분을 같이 남겨주시면 더 빠르게 상황을 파악하고 답변드릴 수 있어요 🙂어떤 강의를 들으면서 발생했나요? 1-6 PIVOT 예시 문제 풀이어떤 문제가 생겼나요? 강의에서 사용하신 쿼리 그대로 입력했는데 추출되는 결과가 다릅니다. 왜 인지 이유를 모르겠습니다ㅠ어떤 시도를 해보셨나요?잘못입력한 쿼리가 있는지 확인해봤는데 어떤 것이 문제인지 잘 모르겠습니다.어떤 쿼리를 사용했나요?#앱 로그 데이터 PIVOT SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, MAX(IF(param.key = "firebase_screen", param.value.string_value, NULL)) AS firebase_screen, --MAX(IF(param.key = "food_id", param.value.string_value, NULL)) AS food_id, MAX(IF(param.key = "food_id", param.value.int_value, NULL)) AS food_id2, MAX(IF(param.key = "session_id", param.value.string_value, NULL)) AS session_id FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS param WHERE event_date = "2022-08-01" GROUP BY ALL LIMIT 100환경이 어떻게 되나요?(윈도우, 맥 중 택1, 크롬 같은 웹브라우저 환경) 크롬결과값선생님께서 입력하신 쿼리와 무슨 차이가 있는건가요?데이터가 표출되는 정렬이 달라서 이렇게 나오는 것인지 강의 영상 내 결과에서는 food_id2 컬럼의 값이 모두 채워져있는데 저는 NULL로 나옵니다. 왜인지 모르겠습니다 ㅠ
-
미해결14년차 마케터에게 배우는 데이터드리븐 디지털/퍼포먼스마케팅의 모든것
문의하기 버튼 오류
제 홈페이지에 있는 문의하기 버튼 테스트해보려고 연습중인데 계속 이렇게 뜨면서 집계가 안되는 이유가 있을까요?홈페이지 주소: https://www.visionbrick.co.kr/
-
미해결[프리미엄] AI와 대화하며 웹 서비스 만들기
백엔드
안녕하세요 선생님 이제 강의ㅣ를 수강시작하는 1인개발을 목표로 하는 직장인입니다.혹시 백엔드는 요번강의에서는 구축 해서 하는건 포함 안되어 있는건가요?? 실제로 만약 카페를 운영한다고 가정하면 구글 시트만으로는 실제 운영할 떄는 어렵겠죠??
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
최종과제 제출
질문을 남겨주실 때 아래 부분을 같이 남겨주시면 더 빠르게 상황을 파악하고 답변드릴 수 있어요 🙂어떤 강의를 들으면서 발생했나요?어떤 문제가 생겼나요?어떤 시도를 해보셨나요? 어떤 쿼리를 사용했나요?환경이 어떻게 되나요?(윈도우, 맥 중 택1, 크롬 같은 웹브라우저 환경)배운 것을 토대로 분석해보았는데, 홈페이지에 올렸습니다링크
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-13. 리텐션 과제
안녕하세요3-13 리텐션 과제를 풀어보았습니다익숙치 않아서 그런지 꽤나 어려웠네요https://uncleq.tistory.com/entry/%EB%A6%AC%ED%85%90%EC%85%98-%EC%97%B0%EC%8A%B5
-
미해결[프리미엄] AI와 대화하며 웹 서비스 만들기
커서 ai 노트패드가 안보여요.
최근에 커서 ai 노트패드가 지원안한다라는것같은데이 부분 어떻게 해야할까요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
1-9. [자습] PIVOT 테이블 생성하기
WITH base as ( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, platform, MAX(IF(params.key='firebase_screen', params.value.string_value, NULL)) as firebase_screen, -- MAX(IF(params.key='food_id', params.value.int_value, NULL)) as food_id, MAX(IF(params.key='session_id', params.value.string_value, NULL)) as session_id, FROM advanced.app_logs CROSS JOIN UNNEST(event_params) as params WHERE -- event_date = "2022-08-01" # 적은 데이터로 쿼리를 작성하기 위해 만든 조건 event_date BETWEEN "2022-08-01" AND "2022-08-18" GROUP BY ALL ), fileter_event_and_concat_event_and_screen AS( -- event_name + screen 하면서(필요한 이벤트만 WHERE 조건에 걸어서 사용) SELECT * EXCEPT(event_name, firebase_screen, event_timestamp), CONCAT(event_name, "-", firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), "Asia/Seoul") AS event_datetime FROM base WHERE event_name IN("screen_view", "click_payment") ) -- step_number + cnt 만들기 -- step_number : CASE WHEN을 사용해 숫자 지정 , pivot_base as ( SELECT event_date, # 일자별로 퍼널별 유저 수 쿼리, 일자별로 처리하기 위해 event_date 추가 event_name_with_screen, 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 user_pseudo_id) as cnt FROM fileter_event_and_concat_event_and_screen GROUP BY ALL HAVING step_number IS NOT NULL ORDER BY event_date -- WHERE -- user_pseudo_id = "2173465695.8694960923" -- user_pseudo_id = "2173465695.8694960923" :event_name_with_screen = screen_view-welcome의 user_id는 NULL -> home에서 로그인 -- food_detal, search 등 event_name_with_scree의 여러 요소들을 확인해보기 ) # [자습] 위 테이블을 screen_view 타입별로 피벗 테이블 만들기 쿼리 (위 테이블을 with 절로 만들고 아래 쿼리 실행) SELECT event_date, MAX(IF(event_name_with_screen="screen_view-welcome", cnt, NULL)) as `scren_view-welcome`, MAX(IF(event_name_with_screen="screen_view-home", cnt, NULL)) as `scren_view-home`, MAX(IF(event_name_with_screen="screen_view-food_category", cnt, NULL)) as `scren_view-category`, MAX(IF(event_name_with_screen="screen_view-restaurant", cnt, NULL)) as `scren_view-restaurant` FROM pivot_base GROUP BY event_date ORDER BY event_date과제 올립니다 감사합니다
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
3-7. 리텐션 쿼리 작성 및 질문(Weekly, Montly)
안녕하세요,강의 수강하면서 Weekly, Monthly Retention 쿼리를 작성해보았습니다!그리고 질문이 하나 있는데, 첨부해드린 코드는 현재 첨부해드린 사진처럼 오류가 발생합니다. 그런데 Weekly Retention 쿼리를 전부 주석처리하면 Monthly Retention 쿼리는 정상 작동합니다. 반대로 Monthly Retention 쿼리를 주석처리하면 Weekly Retention 쿼리는 정상 작동합니다.이 현상의 원리에 대한 감이 잡히지 않아서 질문드립니다!그 외에 쿼리 관련해서 고칠 점이 있다면 편하게 말씀해주시면 감사하겠습니다!WITH base AS ( SELECT 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" ), first_week_and_diff AS ( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) diff_of_day DATE_DIFF(event_week, first_week, WEEK) diff_of_week FROM ( SELECT DISTINCT -- 일자별로 중복 제거 user_pseudo_id, -- DATE_TRUNC DATE_TRUNC(MIN(event_date) OVER (PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, MIN(event_date) OVER (PARTITION BY user_pseudo_id) AS first_date, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week, event_date FROM base ) ), first_month_and_diff AS ( SELECT *, -- DATE_DIFF(event_date, first_date, DAY) diff_of_day DATE_DIFF(event_month, first_month, MONTH) AS diff_of_month FROM ( SELECT DISTINCT user_pseudo_id, --DATE_TRUNC DATE_TRUNC(MIN(event_date) OVER (PARTITION BY user_pseudo_id), MONTH) AS first_month, DATE_TRUNC(event_date, MONTH) AS event_month, MIN(event_date) OVER (PARTITION BY user_pseudo_id) AS first_date, event_date FROM base ) ) -- Weekly Retention SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_cnt), 3) AS week_retention_rate FROM ( SELECT *, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_week) AS first_cnt FROM ( SELECT diff_of_week, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_week_and_diff GROUP BY diff_of_week ) ) ORDER BY diff_of_week; -- 추가. Monthly Retention SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_cnt), 3) AS month_retention_rate FROM ( SELECT *, FIRST_VALUE(user_cnt) OVER (ORDER BY diff_of_month) AS first_cnt FROM ( SELECT diff_of_month, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM first_month_and_diff GROUP BY diff_of_month ) ) ORDER BY diff_of_month;