Q6) 팀 프로젝트 열심히 했으니 다시 놀아볼까요?!
아래와 같은 lol_users(LOL 유저 테이블)이 있습니다.
id name region rating join_date 1 르탄이 한국 1300 2019-06-15 2 배캠이 미국 1500 2020-09-01 3 구구이 한국 1400 2021-01-07 4 이션이 미국 1350 2019-11-15
21. lol_users 테이블에서 각 유저의 레이팅(rating) 순위를 계산하는 쿼리를 작성해주세요! 전체 지역(region) 기준이고 순위는 레이팅이 높을수록 높아야해요. (e.g. rating 1400 유저의 순위 > rating 1350 유저의 순위)
더보기
select *, RANK() OVER (ORDER BY rating DESC) AS Ranking from lol_users
22. lol_users 테이블에서 가장 늦게 게임을 시작한(join_date) 유저의 이름을 선택하는 쿼리를 작성해주세요!
더보기
select name from lol_users ORDER BY join_data DESC LIMIT 1
23. lol_users 테이블에서 지역별로 레이팅이 높은 순으로 유저들을 정렬해서 나열하는 쿼리를 작성해주세요!
더보기
select * from lol_users order by region, rating DESC
24. lol_users 테이블에서 지역별로 평균 레이팅을 계산하는 쿼리를 작성해주세요!
더보기
select region, AVG(rating) AS avg_rating from lol_users GROUP BY region
핵심 개념 정리
각 유저의 rating을 기준으로 순위를 매기는 SQL 쿼리는 RANK(), DENSE_RANK(), 또는 ROW_NUMBER() 윈도우 함수를 사용하여 작성 가능
아래 쿼리는 RANK()를 사용하여 동일한 rating을 가진 유저가 있을 경우 같은 순위를 부여한다.
SELECT
id,
name,
region,
rating,
RANK() OVER (ORDER BY rating DESC) AS ranking
FROM lol_users;
- RANK() OVER (ORDER BY rating DESC) AS ranking
→ rating을 내림차순(DESC)으로 정렬하여 순위를 매김 - RANK() 함수는 동일한 rating을 가진 경우 같은 순위를 부여하고, 그다음 순위는 건너뜀
결과 예시:
2 | 배캠이 | 미국 | 1500 | 1 |
3 | 구구이 | 한국 | 1400 | 2 |
4 | 이션이 | 미국 | 1350 | 3 |
1 | 르탄이 | 한국 | 1300 | 4 |
추가 옵션:
- 연속적인 순위 부여 (DENSE_RANK()):
동일한 rating을 가진 경우 같은 순위를 부여하되, 건너뛰지 않고 연속된 순위를 매김 - 유저마다 고유한 순위 (ROW_NUMBER()):
동점자가 있어도 순위를 건너뛰지 않고, 고유한 순위를 부여함
'PM > SQL' 카테고리의 다른 글
[내일배움캠프 TIL] 사전캠프 9일차 SQL 기초(8) (1) | 2025.03.20 |
---|---|
[내일배움캠프 TIL] 사전캠프 8일차 SQL 기초(7) (0) | 2025.03.19 |
[내일배움캠프 TIL] 사전캠프 6일차 SQL 기초(5) (0) | 2025.03.17 |
[내일배움캠프 TIL] 사전캠프 5일차 SQL 기초(4) (0) | 2025.03.14 |
[내일배움캠프 TIL] 사전캠프 4일차 SQL 기초(3) (0) | 2025.03.13 |