[DataLemur] Second Day Confirmation

다람·약 20시간 전

DataLemur

목록 보기
2/2
post-thumbnail

1. 문제 이해

이 문제는 다음 조건을 모두 만족하는 user_id를 찾는 문제이다

  • 회원가입을 했다
  • 가입 당일에는 인증하지 않았다
  • 가입 다음 날에 인증(Confirmed)했다

즉 핵심은 다음 두가지이다.

  • 인증 날짜가 가입 날짜 + 1일
  • 인증 상태가 Confirmed

2. 처음 접근 방법

SELECT user_id 
FROM emails as e
JOIN texts as t
ON t.email_id = e.email_id
WHERE e.signup_date != t.action_date
AND (date(t.action_date) - date(e.signup_date)) = 1;

접근 의도

  • emails와 texts를 email_id로 JOIN을 진행
  • 가입 날짜와 인증 날짜를 비교
  • 날짜 차이가 1이면 "다음 날 인증"이라고 판단
  • 당일 인증을 제외하기 위해 != 조건 추가

3. 문제점

결과값은 동일해서 문제는 통과했지만 다시 쿼리문을 보니 문제가 있었다.

1. 불필요한 조건

e.signup_date != t.action_date

이미 날짜 차이가 1인 경우(date(t.action_date) - date(e.signup_date))만 필터링하고 있기 때문에 해당 조건은 의미 없이 중복된 조건이였다.

2. 핵심 조건 누락

문제 조건 중 중요한 부분이 인증 상태가 'Confirmed'여야 한다는 것인데
작성한 쿼리에 이 조건을 넣지 않았다.
이렇게 되면 그냥 날짜 차이가 1인 조건만 계산되어서 'Not confirmed' 데이터까지 포함될 수 있다는 점이다.

3. 날짜 계산 방식

date(t.action_date) - date(e.signup_date)

의도를 명확하게 하기위해서 함수를 사용하여 날짜를 계산하는 방법이 더 좋다고 판단했다.

기존 쿼리 결과

결론적으로 기존 쿼리의 결과를 설명하면

  • 다음 날이 아닌 경우가 포함될 가능성 있음
  • Not confirmed 데이터 포함 가능
    이러한 문제들이 존재한다.

실제 정답

실제 문제에서 원하는 정답은 가입 다음 날에 Confirmed 상태인 사용자만 포함하는 것이라는 것을 다시 상기할 필요가 있었다.

5. 핵심 개념 정리

  • 날짜 비교는 명확한 함수 사용이 중요하다
  • 조건은 문제에서 요구하는 단위로 정확히 분리해야 한다
  • JOIN 이후 어떤 데이터가 포함되는지 항상 고려해야 한다

6. 수정 쿼리

SELECT DISTINCT e.user_id
FROM emails e
JOIN texts t
  ON e.email_id = t.email_id
WHERE t.signup_action = 'Confirmed'
  AND DATEDIFF(t.action_date, e.signup_date) = 1;

7. 쿼리 흐름 설명

1단계: JOIN

JOIN texts t ON e.email_id = t.email_id
  • 이메일과 인증 데이터를 연결

2단계: 조건 필터링

DATEDIFF(t.action_date, e.signup_date) = 1
  • 가입 다음 날 조건 필터링

3단계: 인증 완료 데이터 필터링

t.signup_action = 'Confirmed'
  • 실제 인증 완료된 데이터만 필터링

4단계: DISTINCT 중복제거

DISTINCT e.user_id
  • JOIN 이후에는 하나의 사용자에 대해 여러 행이 생성될 수 있기 때문에 중복제거

8. 헷갈렸던 부분 다시 정리

1. 날짜 비교 방식

  • DATE - DATE 방식도 가능하지만 단순 일자 차이를 구할 때 시분초를 포함하여 계산하기 때문에
  • 의도치 않은 결과가 나올 수 있어 DATEDIFF 사용이 더 명확하다.

2. 조건 해석

  • 단순히 날짜 차이만 보면 안되고 "Confirmed 여부"까지 함께 고려해야 한다. 문제의 조건을 꼭 잘 봐야될 것 같다.

9. 패턴 정리

이 문제는 다음 패턴으로 정리할 수 있다.

JOIN
-> 날짜 조건
-> 상태 조건
-> DISTINCT
profile
개발하는 다람쥐

0개의 댓글