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에서 처리하라는 팀 규칙 존재 가능성 (그룹 규칙을 따르라는 뜻)
  1.