inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

3-7. 리텐션 SQL 쿼리 작성하기 : Weekly Retention

Weekly 및 Monthly Retention 과제 제출합니다.

2

Kay

작성한 질문수 1

0

--Weekly Retention

WITH base AS(
  SELECT
    user_pseudo_id,
    event_name,
    DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_date,
    DATE_TRUNC(DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul'), WEEK(MONDAY)) AS event_week,
  FROM advanced.app_logs
  WHERE
    event_date BETWEEN '2022-08-01' AND '2022-11-03'
), first_week_data AS(
#first_week 추출
SELECT
  DISTINCT
    user_pseudo_id,
    event_week,
    MIN(event_week) OVER(PARTITION BY user_pseudo_id) AS first_week,
FROM base
), week_diff_user_cnt_data AS(
  #week_diff 및 user_cnt 추출
  SELECT
    week_diff,
    COUNT(DISTINCT user_pseudo_id) AS user_cnt
  FROM(
    SELECT
      *,
      DATE_DIFF(event_week, first_week, WEEK(MONDAY)) AS week_diff
    FROM first_week_data
    )
  GROUP BY week_diff
)

#first_week_user_cnt 및 retention_ratio 추출
SELECT
  *,
  ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt), 3) AS retention_rate
FROM(
  SELECT
    *,
    FIRST_VALUE(user_cnt) OVER(ORDER BY week_diff) AS first_week_user_cnt
  FROM week_diff_user_cnt_data
  )
ORDER BY week_diff
--Monthly Retention

WITH base AS(
  SELECT
    user_pseudo_id,
    event_name,
    DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_date,
    DATE_TRUNC(DATE(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul'), MONTH) AS event_month,
  FROM advanced.app_logs
  WHERE
    event_date BETWEEN '2022-08-01' AND '2022-11-03'
), first_month_data AS(
#first_month 추출
SELECT
  DISTINCT
    user_pseudo_id,
    event_month,
    MIN(event_month) OVER(PARTITION BY user_pseudo_id) AS first_month,
FROM base
), month_diff_user_cnt_data AS(
  #month_diff 및 user_cnt 추출
  SELECT
    month_diff,
    COUNT(DISTINCT user_pseudo_id) AS user_cnt
  FROM(
    SELECT
      *,
      DATE_DIFF(event_month, first_month, MONTH) AS month_diff
    FROM first_month_data
    )
  GROUP BY month_diff
)

#first_month_user_cnt 및 retention_ratio 추출
SELECT
  *,
  ROUND(SAFE_DIVIDE(user_cnt, first_month_user_cnt), 3) AS retention_rate
FROM(
  SELECT
    *,
    FIRST_VALUE(user_cnt) OVER(ORDER BY month_diff) AS first_month_user_cnt
  FROM month_diff_user_cnt_data
  )
ORDER BY month_diff

더 보완할 점은 없는지 평가해 주시면 감사하겠습니다. 강의 항상 정말 잘 듣고있습니다.


sql Google-Analytics firebase google-sheets bigquery

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

Kay님께서 작성하신 Weekly 및 Monthly Retention SQL 쿼리에 대해 리뷰를 해드리겠습니다. 작성하신 쿼리는 매우 잘 구성되어 있어 리텐션 분석을 수행하는 데 충분한 정보를 제공하고 있습니다. 그러나 몇 가지 개선할 수 있는 부분을 말씀드리겠습니다.

개선 제안 사항

  1. CTE 내의 중복 필드 제거:

    • MIN(event_week) OVER(PARTITION BY user_pseudo_id) 같은 연산을 DISTINCT와 함께 사용할 필요가 없습니다. 이미 같은 결과를 추출합니다.
  2. 사용자 데이터의 유효성 검사:

    • 데이터의 일관성과 정확성을 위해 시간 계산과 관련된 테이블이 올바르게 정리되었는지 확인하세요. 예를 들어, event_date BETWEEN 조회 조건을 쿼리 밖에서도 확인하여 서로 다른 기간의 데이터를 처리하지 않도록 주의해야 합니다.
  3. 네이밍 컨벤션 및 가독성:

    • 컬럼이나 CTE의 네이밍은 코드 가독성을 높이고 다른 개발자들이나 스스로 나중에 쿼리를 이해하기 쉽게 도와줍니다. base, first_week_data 대신 좀 더 의미 있는 이름을 사용할 수 있습니다.
    • 주석도 간단하고 명확하게 작성하여 나중에 쿼리를 읽는 사람이 쉽게 이해할 수 있도록 지향합니다.
  4. 쿼리 간 결합 검사:

    • Weekly와 Monthly 모두 동일한 base CTE를 사용하고 있어 유지보수 측면에서 쿼리 블록이 서로 영향을 미칠 수 있습니다. 필요시, 두 계산을 분리하거나 재사용을 고려하세요.

리소스 제공

유사한 문제나 개선을 담고 있는 질문과 답변을 통해 더욱 깊은 이해를 얻으실 수 있습니다. 다음 링크를 참고하시기 바랍니다:

  1. 3-7 리텐션 SQL 쿼리 작성하기 연습 (Weekly, Monthly)

    • 복잡한 쿼리 내 가독성 및 개선할 점에 대한 정보를 제공하고 있습니다.
  2. 3-7. Weekly 리텐션 쿼리 작성 및 질문

    • 데이터 분석 시 리텐션 계산 후 발생할 수 있는 중복 등을 다루고 있습니다.

이 자료들이 Kay님의 SQL 쿼리 작성에 보다 큰 도움이 되기를 바랍니다. 강의를 통해 데이터 분석 능력을 꾸준히 발전시키시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

[과제] 퍼널 쿼리 PIVOT 테이블 작성

0

49

2

최종 과제 제출

0

127

3

BigQuery 활용편 18강 질문있습니다!

0

98

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

101

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

94

2

biquery 테이블 생성 오류 이슈

0

75

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

86

2

[과제] 퍼널 PIVOT 테이블 작성하기

0

85

2

array 등

0

79

2

N day 리텐션 쿼리 관련 질문

0

77

2

이동평균 계산 시 order by 기본값은 뭔가요?

0

84

2

윈도우 연습문제 1번 질문

0

80

1

user_id에 NULL이 나오는데 정상인가요?

0

85

2

3-13 리텐션 과제 제출

0

112

2

최종 과제 제출

0

151

3

weekly retention 구하기 과제

0

105

2

1-9. 피벗 쿼리 작성

0

95

2

app_logs 테이블 생성 문제

0

88

2

Weekly Retention 구하기 완성하였습니다.

0

90

2

[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료

0

123

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

97

2

정성 데이터 분석 방법 문의

0

181

1

최종 과제 제출

0

117

3

1-6 예시 문제 풀이

0

79

2