SQL
[SQL] Analyzing User Retention (유저 리텐션 분석) (DATEDIFF / BETWEEN AND / HAVING)
beie
2024. 12. 4. 17:28
* 문제 애매한 점 정의
- reservation date가 따로 없음. ⇒ activity_date를 reservation date로 취급
- 가입일에만 접속 로그가 남아있는 사용자 처리 조건 명시 x -> 가입일에만 접속한 사람도 활동유저로 집계
SELECT ua.user_id, ua.activity_date, COUNT(ua.activity_date)
FROM user_profiles AS up
JOIN user_activities AS ua
ON up.user_id = ua.user_id
WHERE DATEDIFF(activity_date, signup_date) BETWEEN 0 AND 30
GROUP BY up.user_id
--HAVING COUNT(up.user_id)>0--
* DATEDIFF (A, B)
- A - B = date difference
* DATEDIFF (A, B) BETWEEN 0 AND 30
- 0 <= A - B <= 30
* Having?
- You can get the same accurate result when writing except HAVING.
- but using HAVING is recommended for three reasons.
(1) 안전한 설계 (Robust Query Design)
- 데이터의 구조나 무결성을 100% 확신하지 못하는 경우, 추가적으로 HAVING을 넣는 것이 좋음
- 특히 데이터셋이 크고 다양할 때, 잘못된 데이터(예: NULL 값)나 특정 예외 상황을 방지하기 위해 HAVING을 쓰는 것이 권장
(2) 가독성 (Readability)
- 다른 사람이 쿼리를 읽을 때, 결과에 포함된 그룹이 필터링 기준을 만족하는지 명시적으로 보여주는 장점
(3) 기존 쿼리 패턴 유지 (Consistency with Query Patterns)
- 일부 환경에서는 WHERE와 HAVING의 역할이 명확히 구분되므로, 모든 집계 조건은 HAVING에서 처리하라는 팀 규칙 존재 가능성 (그룹 규칙을 따르라는 뜻)