리텐션 SQL 작성하기
쿼리 작성하다가 DISTINCT에 대해 궁금한 점이 생겨 질문 남깁니다!
WITH 문 base 와 first_week_data에서 DISTINCT는 중복 방지 즉, 비용 절약을 위해서 쓰는 것으로 이해했습니다.
그렇다면 DISTINCT를 쓰지 않아도 쿼리상 문제는 없는 게 맞을까요?
user_count에서 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
답변 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





