각각 난이도가 적혀있는 문장과 단어들이 들어가있는 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/