본문 바로가기

Database/MySql

[MySQL] DB 쿼리 작성 RANK 순위 함수, PARTITION BY 테이블 분할 함수

각각 난이도가 적혀있는 문장과 단어들이 들어가있는 DB 테이블이 있다고 가정하고
테이블에서 난이도 별로 가장 많이 사용한 문장 형식(sentence_form) 탑 10 그리고
난이도 별로 가장 많이 사용한 단어(word) 탑 10 쿼리를 작성해보자.

순위함수에는  RANK, DENSE_RANK, ROW_NUMBER 세 가지가 있는데

RANK : 같은 값이면 중복 순위를 부여, 다음 순위는 부여한 중복 순위 개수 만큼 건너뛰고 반환.
DENSE_RANK : 같은 값이면 중복 순위를 부여, 다음 순위는 부여한 중복 순위 개수와 상관없이 순차적으로 반환.
ROW_NUMBER : 중복과 상관없이 순차적으로 RANK를 반환.

먼저 첫번째 문장의 쿼리부터 만들어보자

테이블에서 난이도(level) 별로 가장 많이 사용한 문장 형식(sentence_form) 탑 10 

SELECT rank.* FROM(
	SELECT LEVEL, sentence_form, COUNT, 
	ROW_NUMBER() OVER (PARTITION BY level order BY COUNT DESC) RANK
	FROM sentence_statistics_details
)rank WHERE rank<=10;

순위함수인 ROW_NUMBER와 테이블 분할 함수인 PARTITION BY를 사용하였다.

 

level별로 가장 많이 사용한 단어(word) 탑 10

select rank.* from(
	SELECT d.level, w.word, d.count,
	ROW_NUMBER() OVER (PARTITION BY d.level order BY d.count DESC) RANK
	FROM word_statistics_details d, word_details w
	WHERE d.word_id = w.id
)rank WHERE rank<=10;


내부 조인을 사용하였다.

 

 

 

 

참고한 링크

https://spin.atomicobject.com/2016/03/12/select-top-n-per-group-postgresql/

 

Selecting Top N Per Group in PostgreSQL

I wanted to select the top two items in our PostgreSQL database, grouped by color, and sorted by when they were created.

spin.atomicobject.com