inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3-6. 리텐션 SQL 쿼리 작성하기 : N Day Retention

리텐션 SQL 작성하기

해결된 질문

194

jenna

작성한 질문수 13

0

쿼리 작성하다가 DISTINCT에 대해 궁금한 점이 생겨 질문 남깁니다!

WITH base AS (
  SELECT 
   DISTINCT
    user_id,
    event_name,
    DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime,
    DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date,
    user_pseudo_id
  FROM advanced.app_logs
)
,first_week_data AS (
  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 week_date
  FROM base
)
,first_week_diff_data AS (
  SELECT 
  *,
  DATE_DIFF(week_date,first_week,week) AS first_week_diff
  FROM first_week_data
)
,user_count AS (
SELECT 
 first_week_diff,
 COUNT(DISTINCT user_pseudo_id) AS user_cnt
FROM first_week_diff_data
GROUP BY ALL
)
,first_user_count AS (
SELECT 
 first_week_diff,
 user_cnt,
 FIRST_VALUE(user_cnt) OVER (ORDER BY first_week_diff) AS first_user_cnt
FROM user_count
)
SELECT 
 *,
 ROUND(SAFE_DIVIDE(user_cnt,first_user_cnt),2) AS rentention_ratio 
FROM first_user_count

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

카일스쿨

안녕하세요.

 

해당 쿼리에서 first_week_data CTE 구문에서 distinct가 없으면 여러 Row가 생기게 됩니다. first_week_data를 구할 때 유저별 일자별로 Row가 1개만 남도록 의도했다면 DISTINCT를 작성하는게 좋습니다

DISTINCT는 중복을 제거할 때 사용하는 것이고, 위 쿼리에서는 리텐션을 구하기 위함이라 DISTINCT를 쓰는게 더 좋습니다. DISTINCT를 사용하지 않아도 마지막에 user_cnt를 구할 때 DISTINCT해서 이 쿼리에선 결과 차이가 없긴 하지만, 실무에서 여러 JOIN이 있는 쿼리를 하시다가 데이터가 뻥튀기 될 수 있습니다. 이를 위해 평소부터 중복을 제거하며 쿼리를 작성하는 것을 추천드려요.

Row가 많다는 것은 이후에 쿼리의 성능에도 영향을 미치기 때문에 중복 데이터가 있다면 제거하는 것이 좋습니다

최종 과제 제출

0

82

3

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

0

85

1

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

0

83

2

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

0

75

2

biquery 테이블 생성 오류 이슈

0

56

2

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

0

75

2

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

0

67

2

array 등

0

63

2

N day 리텐션 쿼리 관련 질문

0

63

2

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

0

69

2

윈도우 연습문제 1번 질문

0

65

1

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

0

73

2

3-13 리텐션 과제 제출

0

94

2

최종 과제 제출

0

130

3

weekly retention 구하기 과제

0

90

2

1-9. 피벗 쿼리 작성

0

81

2

app_logs 테이블 생성 문제

0

73

2

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

0

77

2

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

0

107

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

109

3

1-6 예시 문제 풀이

0

70

2

최종과제 제출

0

145

2