WIL_20240509

HJ·2024년 5월 9일

WIL(since_20240415)

목록 보기
2/3

지난 SQL 세션 3회차의 3번문제의 오류를 알아내서 수정했다!

<문제 3.>

  • user 테이블에서 game_account_id, date, serverno 를 추출한 데이터와 매출 테이블에서 game_account_id 별 가장 마지막 결제일자를 찾고 join 을 진행해주세요.
  • 그 다음, datediff 함수를 사용해 결제일자-접속일자를 구해주세요. 그리고 컬럼이름을 diffdate로 설정해주세요. 두 날짜의 형식은 같아야 합니다.
  • 마지막으로, 인라인 뷰 subquery 를 이용하여 서버별 평균 diffdate를 구해주세요.
    다만, 평균 datediff 컬럼은 정수 형태로 출력되어야 합니다. 또한, 조건절에 diffdate 값이 10일 이상인 경우를 필터링해주세요. 그리고 서버번호를 기준으로 내림차순 정렬해주세요. (전체결과 중 일부입니다.)

<1차 답안>

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;

= 튜터님의 정답과 비교했을 때, joindate_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이 더 편한건 사실이지만 더 어려운 듯 하다..
이제 다음주부터 프로젝트가 시작된당

다음주도 화이팅!

profile
First time, Last time, Every time.

0개의 댓글