✨20240627 TIL
@SQL 라이브 세션 1일 차 숙제
문제1
date 칼럼이 2023-01-01보다 큰 날짜의 game_account_id, game_actor_id, serverno를 추출
select game_account_id,
game_actor_id,
serverno
from users
where date > '2023-01-01'
2023-01-01보다 큰 날짜를 구해야 하기 때문에 where 절 사용
문제2
조건1) level 컬럼이 10 초과이고 >> level > 10
조건2) serverno 컬럼이 1이 아니며 >> serverno <> 1
조건3) 아이템이름컬럼이 레벨업 패키지 또는 시즌패스이고 >> etc_str2 in ('레벨업 패키지', '시즌패스')
조건4) 아이템 획득경로가 상점에서 구매한 경우의 >> date, ip_addr, exp, zone_id를 추출하고 결괏값을 date 기준 내림차순으로 정렬
>> etc_str1='상점에서 구매' // date 기준 내림차순이기 때문에 order by date desc로 작성
select date,
ip_addr,
exp,
zone_id
from users
where 'level' > 10 and serverno <> 1 and etc_str2 in ('레벨업 패키지', '시즌패스') and etc_str1='상점에서 구매'
order by 1 desc
문제3
case when 구문을 사용하여 레벨구간을 아래와 같이 구분하고 칼럼이름을 levelgroup으로 설정해 주세요
- 레벨구간
- 1~10Lv 이하
- 11~20Lv 이하
- 21~30Lv 이하
- 31~40Lv 이하
- 41~50Lv 이하
- 51~60Lv 이하
- 61~70Lv 이하
- 71~80Lv 이하
- 81~90Lv 이하
- 91~100Lv
game_actor_id, level, levelgroup, date 칼럼을 추출하고 date를 기준으로 내림차순 정렬
select game_actor_id,
level,
case when level <= 10 then '1~10Lv 이하'
when level <= 20 then '11~20Lv 이하'
when level <= 30 then '21~30Lv 이하'
when level <= 40 then '31~40Lv 이하'
when level <= 50 then '41~50Lv 이하'
when level <= 60 then '51~60Lv 이하'
when level <= 70 then '61~70Lv 이하'
when level <= 80 then '71~80Lv 이하'
when level <= 90 then '81~90Lv 이하'
else '91~100Lv' end 'levelgroup',
date
from users
order by 4 desc
문제4(고난이도 문제)
date 칼럼을 yyyy-mm 형식의 월 형태를 바꾸고, 칼럼이름을 m으로 지정해 주세요
game_account_id, game_actor_id를 추출하되, 월을 기준으로 오름차순, 월이 같을 경우 game_actor_id를 내림차순으로 정렬해 주세요
select date_format(date, '%Y-%m') m,
game_account_id,
game_actor_id
from users
order by 1, game_actor_id desc
yyyy-mm 형태로 바꾸기 위해선 substr이나 내가 쓴 date_format을 사용하면 될 것 같다.
substr은 substr(date, 1, 7) 이렇게 표현 가능하고 첫 번째 숫자는 시작하는 문자의 순서이고 두 번째 숫자는 끝낼 문자의 순서를 넣은 것
>> 고난이도 문제라고 나와있었지만 코드카타를 사전캠프 때부터 매일 푼 결과 나한테는 크게 어렵게 다가온 문제는 아니었다!
형식을 바꾸는 함수와 오름차순 내림차순을 잘 이해하고 있다면 충분히 풀 수 있는 문제였던 것 같다
@ SQL 라이브 세션 2일 차 숙제
문제1
group by 절을 사용하여, 서버별 게임캐릭터 id 수(중복값 허용 x)와 평균 경험치를 추출해 주세요.
select serverno,
count(distinct(game_actor_id)) actor_cnt,
avg(exp) avg_exp
from users
group by serverno
- 중복값 허용하지 않기 때문에 distinct 함수 사용
- count 함수를 이용한 게임캐릭터 수 구하기
- avg 함수를 이용한 평균 경험치 구하기
- 문제에서 group by 절을 사용하고 서버별 게임 캐릭터에 대한 수와 평균 경험치이기 때문에 서버를 group by 해준다
문제2
group by와 having 절을 사용하여, 날짜 별(yyyy-mm-dd) 게임캐릭터 id 수(중복값 허용 x)를 구하고, 그 값이 10개를 초과하는 경우를 추출해 주세요
select date,
count(distinct(game_actor_id)) actor_cnt
from users
group by date
having actor_cnt > 10
- 중복값 허용하지 않기 때문에 distinct 함수 사용
- 날짜 별 게임 캐릭터의 수를 구해야 하기 때문에 group by 절 사용
- having- WHERE절은 GROUP BY 전 데이터를 기준으로 필터링을 한다면, HAVING절은 GROUP BY 후
- 결괏값을 기준으로 데이터를 필터링
문제3(고난이도)
위와 같은 문제를 having이 아닌 인라인 뷰 subquery를 사용하여 추출해 주세요.
select *
from
(
select date,
count(distinct(game_actor_id)) actor_cnt
from users
group by date
) a
where actor_cnt > 10
'✨Today I Learned' 카테고리의 다른 글
데이터 리터러시 (0) | 2024.07.03 |
---|---|
SQL 라이브 3일차 숙제 (0) | 2024.06.28 |
SQL코트카타 26번~28번/SQL연습문제1~5 (1) | 2024.06.14 |
SQL 코드카타 25번/SQL 과제1~3/파이썬 코드 정리 (0) | 2024.06.13 |
SQL코드카타24번/ 파이썬 코드카타 9번~13번 (0) | 2024.06.12 |