게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
MariaDB로 RANK() ORVER PARTITION BY 흉내 내기
게시물ID : programmer_14507짧은주소 복사하기
작성자 : 배터지리안
추천 : 3
조회수 : 5212회
댓글수 : 1개
등록시간 : 2015/11/19 14:12:51
옵션
  • 창작글
MariaDB에서 RANK() ORVER PARTITION BY 흉내 내기

MariaDB는 RANK() 함수를 지원하지 않습니다. 그래서 비슷하게 출력하는 쿼리 방법을 고안해 보았습니다.

MariaDB는 쿼리문 내에서 변수를 만들어 쓸 수 있기 때문에 RANK()는 쉽게 구현이 됩니다만, PARTITION BY는 간단치 않습니다.

예를 들어 국회의원 테이블에서 국민에게 막말 많이 한 순으로 순번을 붙여 추출하면 다음과 같을겁니다.

SELECT 이름
,  @RANK := @RANK+1 
FROM 국회의원테이블
WHERE 기준연월 = '201511'
ORDER BY 막말횟수 DESC

이름 RANK
------------
이완영 1
김무성 2
이정현 3
...

여기까지는 어렵지 않습니다.

이 때 전체 국회의원을 대상으로 하지 않고 정당별로 순위을 매기고 싶다면 어떻게 할까요?
일단 정당을 추가해 보겠습니다. 그리고 정당, 막막횟수 순으로 출력하겠습니다.

SELECT 정당, 이름
,  @RANK := @RANK+1 
FROM 국회의원테이블
WHERE 기준연월 = '201511'
ORDER BY 정당, 막말횟수 DESC

정당     이름 RANK
----------------------
새누리 이완영 1
새누리 김무성 2
새누리 이정현 3
...
새누리 ZZZ 158
새정치 XXX 159
새정치 YYY 160
...

정의당과 무소속도 있지만 국회의원테이블에는 교섭단체만 들어 있다고 칩시다.

새정치는 XXX 의원이 1등, YYY 의원이 2등이네요. 우리가 원하는 결과는 아래와 같이 정당별로 순번을 새로 매기는건데 아직 부족하네요.

정당     이름 RANK
----------------------
새누리 이완영 1
새누리 김무성 2
새누리 이정현 3
...
새누리 ZZZ 158
새정치 XXX 1
새정치 YYY 2
...

쿼리문을 다음과 같이 고칩니다.

SELECT 정당, 이름
, CASE WHEN @PARTITION = 정당 THEN 
@RANK := @RANK+1 
 ELSE 
   @RANK := 1 
 END RANK 
, @PARTITION := 정당
FROM 국회의원테이블
WHERE 기준연월 = '201511'
ORDER BY 정당, 막말횟수 DESC

@PARTITION 이라는 변수를 추가하고 CASE WHEN문으로 이전 정당과 같은지 비교합니다.
같으면 하던대로 @RANK를 1 증가시키고, 다르면 @RANK를 1부터 새로 매깁니다.

이제 원하는 결과가 나옵니다. 

만약 전체 다 뽑지 않고 정당별로 TOP 3 만 뽑으려면 Inline view로 만들어서 RANK 값을 필터링 하면 됩니다.

SELECT * 
FROM (
SELECT 정당, 이름
, CASE WHEN @PARTITION = 정당 THEN 
@RANK := @RANK+1 
 ELSE 
   @RANK := 1 
 END RANK 
, @PARTITION := 정당
FROM 국회의원테이블
WHERE 기준연월 = '201511'
ORDER BY 정당, 막말횟수 DESC
) A
WHERE A.RANK <= 3

여기까지 입니다. RANK() OVER PARTITION BY에 비하면야 많이 불편하지만 도움이 되길 바랍니다.

출처 내 컴퓨터
꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호