Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 객체지향 프로그래밍
- IoC
- 프로세스
- 쓰레드
- 항해99장점
- Instance
- 항해99솔직후기
- Dependency Injection
- 스레드
- Thread
- jwt
- 항해99단점
- API
- 인스턴스
- 부트캠프추천
- 회고록
- 오브젝트
- social login
- 객체
- process
- bean
- inversion of control
- 인스턴스화
- 소셜로그인
- object
- DI
- 소셜
- class
- jvm
- 클래스
Archives
- Today
- Total
로운's 기술노트
[2주차] 프로그래밍 기초 주차 (4/5) 본문
ㅇ 오늘 목표 : 데이터 리터러시 완강 + 세션 과제 검증 + 생활코딩 DB 5, 6강
어제 세션에서 어려웠던 2가지 문제가 있다. (덕분에 어제 2시에 잤다..)
쿼리나 문제 조건을 모두 부합하는데, 숫자가 달라, 오전 내내 고민했다.
결국 A문제는 users테이블의 서브쿼리 내 group by에 불필요한 serverno가 들어있었고,
B문제는 평균과 반올림까지 모두 연산된 diffdate에서 '>=10'의 조건을 거니 두 문제 모두 숫자가 틀어질 수밖에 없었다.
sum(pay_amount)에 distinct 를 사용하면 안 된다는 것도 이번에 알았는데,
group by 마에 불필요한 컬럼이 들어있으면 숫자가 틀어질 수 있다는 것을 알게 되었다.
그래도 두 문제 모두 풀고 나니 마음이 매우 가볍다.
일단 내일부턴 파이썬 강의를 빡세게 들어볼 예정이다. (부디 기억이 돌아오길..)
sqld 접수가 내일까진데, 병행이 가능할지 의문이다.
<문제 A>
- 서버번호가 2 이상인 데이터와 결제방식이 CARD 인 경우를 join해 주시고
- game_account_id 를 기준으로 game_actor_id 갯수를 중복값없이 세어주시고, actorcnt 으로 컬럼명을 명시해주세요.
- pay_amount 값을 더해주시고, sumamount 으로 컬럼명을 명시해주세요.
- having 을 사용하지 않고, subquery 사용으로 game_actor_id 갯수가 2 이상인 경우만 추출해주세요. 결과값은 아래와 같아야 합니다. (전체결과 중 일부입니다.)
<쿼리>
select u.game_account_id
, u.actorcnt
, p.sumamount
from(
select game_account_id # 중복 값 제거
, count(distinct game_actor_id) actorcnt # 중복 값 제거
#, serverno -- 요녀석!!
from users u
where serverno >= 2 # 조건: 서버 2이상
group by game_account_id#, serverno -- 요녀석!!
)as u
left join
(
select game_account_id
, sum(pay_amount) sumamount
from payment p
where pay_type = 'CARD' # 조건 : 결제타입_카드
group by 1
)as p
on u.game_account_id = p.game_account_id
where actorcnt >= 2 # 조건 : 캐릭터수 2이상
and p.sumamount is not null # 조건 : 매출액 != null
group by 1,2,3
order by game_account_id
;
<결과>
<문제 B>
- user 테이블에서 game_account_id, date, serverno 를 추출한 데이터와 매출 테이블에서 game_account_id 별 가장 마지막 결제일자를 찾고 join 을 진행해 주세요.
- 그다음, datediff 함수를 사용해 결제일자-접속일자를 구해주세요. 그리고 컬럼이름을 diffdate로 설정해 주세요. 두 날짜의 형식은 같아야 합니다.
- 마지막으로, 인라인 뷰 subquery 를 이용하여 서버별 평균 diffdate를 구해주세요. 다만, 평균 datediff 컬럼은 정수 형태로 출력되어야 합니다. 또한, 조건절에 diffdate 값이 10일 이상인 경우를 필터링해 주세요. 그리고 서버번호를 기준으로 내림차순 정렬해 주세요.
<쿼리>
select u.serverno
, round(avg(datediff(p.p_date,u.m_date)),0) as diffdate # 날짜계산, 평균, 반올림순(정수처리)
from(
select game_account_id
, `date` m_date
, serverno
from users u
)as u
left join
(
select game_account_id
, max(date_format(approved_at,'%Y-%m-%d')) p_date # 최근 값
from payment p
group by game_account_id
)as p
on u.game_account_id = p.game_account_id
where datediff(p.p_date,u.m_date) >= 10 # 날짜gap 10일 이상 필터링
# where diffdate >= 10 -- 요 녀석!!
group by u.serverno
order by u.serverno desc # 서버번호 기준 내림차순
;
<결과>
ㅇ 내일 목표 : 파이썬 종합반 강의 수강 + 생활코딩 DB 7, 8강 (시간이 남으면 SQL코드카타 3문제까지)
'내배캠_데이터분석가_'24.04~08 > 회고' 카테고리의 다른 글
[3주차] 프로그래밍 기초 주차 (1/5) (0) | 2024.04.29 |
---|---|
[2주차] 프로그래밍 기초 주차 (5/5) (0) | 2024.04.26 |
[강의] 데이터 리터러시 (Data Literacy) (0) | 2024.04.25 |
[2주차] 프로그래밍 기초 주차 (3/5) (0) | 2024.04.24 |
[2주차] 프로그래밍 기초 주차 (2/5) (0) | 2024.04.23 |
Comments