지난 SQL 세션 3회차의 3번문제의 오류를 알아내서 수정했다!
- user 테이블에서 game_account_id, date, serverno 를 추출한 데이터와 매출 테이블에서 game_account_id 별 가장 마지막 결제일자를 찾고 join 을 진행해주세요.
- 그 다음, datediff 함수를 사용해 결제일자-접속일자를 구해주세요. 그리고 컬럼이름을 diffdate로 설정해주세요. 두 날짜의 형식은 같아야 합니다.
- 마지막으로, 인라인 뷰 subquery 를 이용하여 서버별 평균 diffdate를 구해주세요.
다만, 평균 datediff 컬럼은 정수 형태로 출력되어야 합니다. 또한, 조건절에 diffdate 값이 10일 이상인 경우를 필터링해주세요. 그리고 서버번호를 기준으로 내림차순 정렬해주세요. (전체결과 중 일부입니다.)
select serverno,
round(avg(diffdate), 0) as avgdiffdate
from
(select u.game_account_id,
date(u.`date` ) dating,
u.serverno,
max(date(p.approved_at)) max_date,
datediff(date(p.approved_at), date(u.`date` )) diffdate
from basic.users u left join pay.payment p on u.game_account_id=p.game_account_id
group by 1, 2, 3, 5
) a
where diffdate>=10
group by 1
order by 1 desc;
= 정답과 컬럼은 같았지만, 컬럼 속의 데이터들이 미세하게 다르다는 오류가 있었다.
select serverno, round(avg(diffdate),0)as avgdiffdate
from( select a.game_account_id, datediff(date_format(date2,('%Y-%m-%d')) ,`date`) as diffdate,serverno
from( select game_account_id, `date`, serverno
from basic.users
)as a
inner join
( select game_account_id, max(approved_at)as date2
from pay.payment
group by game_account_id
)as c
on a.game_account_id=c.game_account_id
)as d
where diffdate>=10
group by serverno
order by serverno desc;
= 튜터님의 정답과 비교했을 때, join과 date_format에서 문제가 있다는 것을 발견했다.

approved_at 컬럼 속의 날짜가 시간까지 포함되어 있기 때문에 date_format함수로 수정해줘야한다.
select serverno, round(avg(diffdate),0) as avgdiffdate
from ( select b.game_account_id, datediff(date_format(date2, ('%Y-%m-%d')), `date`) as diffdate, serverno
from( select game_account_id, `date`, serverno
from basic.users
) as b
inner join
( select game_account_id, max(approved_at) as date2
from pay.payment
group by 1
) as p
on b.game_account_id=p.game_account_id
) as a
where diffdate>=10
group by serverno
order by serverno desc;
= subquery를 활용하여 inner join을 하였고, 다시 인라인 뷰subquery로 데이터를 추출하였다.
select serverno,
round(avg(diffdate), 0) as avgdiffdate
from ( select serverno,
datediff(date_format(date2, ('%Y-%m-%d')), date1) as diffdate
from ( select p.game_account_id,
u.`date` as date1,
u.serverno,
max(p.approved_at) as date2
from basic.users u
inner join pay.payment p
on u.game_account_id=p.game_account_id
group by 1, 2, 3
) a
) b
where diffdate>=10
group by 1
order by 1 desc;
= 원래 내가 하던 방식대로 join을 사용하였을 때, 이런 코드도 정답이라는 것을 발견할 수 있었다.
SQL은 이제 한 시름 놓은 것 같다.. 문제는 PYTHON인데..
일단 코드카타를 풀면서 익혀야겠다..
개인적으로.. PYTHON이 더 편한건 사실이지만 더 어려운 듯 하다..
이제 다음주부터 프로젝트가 시작된당
다음주도 화이팅!