21. lol_users 테이블에서 각 유저의 레이팅(rating) 순위를 계산하는 쿼리를 작성해주세요! 전체 지역(region) 기준이고 순위는 레이팅이 높을수록 높아야해요. (e.g. rating 1400 유저의 순위 > rating 1350 유저의 순위)
SELECT *, DENSE_RANK() OVER (ORDER BY rating DESC) AS rating_rank FROM lol_users; |
22. lol_users 테이블에서 가장 늦게 게임을 시작한(join_date) 유저의 이름을 선택하는 쿼리를 작성해주세요
SELECT name FROM lol_users ORDER BY join_date DESC LIMIT 1; |
23. lol_users 테이블에서 지역별로 레이팅이 높은 순으로 유저들을 정렬해서 나열하는 쿼리를 작성해주세요!
SELECT *, ROW_NUMBER() OVER (PARTITION BY region ORDER BY rating DESC) AS region_rank FROM lol_users; |
24. lol_users 테이블에서 지역별로 평균 레이팅을 계산하는 쿼리를 작성해주세요!
SELECT region, AVG(rating) FROM lol_users GROUP BY region; |
풀이
21번
순위함수 : RANK, DENSE_RANK, ROW_NUMBER, NTILE
1) RANK 함수 : 중복 값들에 대해서 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 개수만큼 떨어진 순위로 출력하도록 하는 함수입니다.
SELECT empNo, empName, salary, RANK() OVER (ORDER BY salary DESC) rank FROM employee; |
2) DENSE_RANK 함수는 : 중복 값들에 대해서 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 값 개수와 상관없이 순차적인 순위 값을 출력하도록 하는 함수입니다.
SELECT empNo, empName, salary, DENSE_RANK() OVER (ORDER BY salary DESC) dens_rank FROM employee; |
3) ROW_NUMBER 함수는 : 중복 값들에 대해서도 순차적인 순위를 표시하도록 출력하는 함수 입니다.
SELECT empNo, empName, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) row_number FROM employee; |
22번
개수제한 : SELECT LIMIT
SELECT * FROM 테이블명 LIMIT 숫자;
--위에서부터 지정한 개수 만큼의 자료를 보여줍니다.
1) 상위 n개만 출력
SELECT name FROM lol_users ORDER BY rating DESC LIMIT 3; -- rating가 큰 순서로 배열 후 상위 3명의 이름을 출력 |
2) 원하는 순위 n개의 이름만 출력
SELECT name FROM lol_users ORDER BY rating DESC LIMIT 2,3; -- rating가 큰 순서로 배열 후 3번째 부터 3명의 이름을 출력 -- 3,4,5위가 출력됨 -- 앞의 숫자는 0부터 시작하므로 2는 3번째 유저입니다. |
23번
ROW_NUMBER() : 결과 집합의 행 일련 번호를 메겨주는 함수입니다. 일반적으로 PARTITION BY 구문과 함께 사용되며 특정 기준으로 나뉘어진 각 파티션의 행들은 ROW_NUMBER()에 의해 '1'부터 차례대로 넘버링 됩니다. 순위 동률을 메기는 RANK()와는 다르게 모든 행의 번호를 고유하게 순차적으로 지정하는 것이 특징입니다.
SELECT *, ROW_NUMBER() OVER (PARTITION BY region ORDER BY rating DESC) AS region_rank FROM lol_users; |
※윈도우 함수(Window Function) : 행과 행간의 관계를 쉽게 정의하기 위해 만든 함수입니다. 윈도우 함수에는 OVER 문구가 키워드로 필수 포함됩니다.
출처
21번 : https://doorbw.tistory.com/221
22번 : https://blog.naver.com/50after/220939872934
23번 : https://m.blog.naver.com/seokcrew/221580449695
'내일배움 과제 > 기타 과제' 카테고리의 다른 글
걷기반 SQL - 8) LOL을 하다가 홧병이 나서 병원을 찾아왔습니다. (0) | 2024.10.21 |
---|---|
걷기반 SQL - 7) 랭크게임 하다가 싸워서 피드백 남겼어요… (0) | 2024.10.18 |
걷기반 SQL - 5) 공부하다보니 팀 프로젝트 시간이 왔어요! (0) | 2024.10.17 |
걷기반 SQL - 4) 이제 놀만큼 놀았으니 다시 공부해봅시다! (0) | 2024.10.17 |
걷기반 SQL - 3) 상품 주문이 들어왔으니 주문을 처리해봅시다! (0) | 2024.10.17 |