SQL의 모든 것/SQL의 실무

오라클 RANK OVER()

IT너드남 2024. 6. 11. 00:36
ORACLE 12g 기준 및 실무 영역으로 작성한 글임을 알려드립니다.

사이트마다 어떤 데이터를 가공하느냐에 따라 다르겠지만, 검증용으로 순위를 매겨야 할 때도 있다.

물론 BI툴을 활용해 해당 부분을 해결할 수도 있겠지만, 데이터로만 논의를 거쳐야 한다면 아래와 같은 예시로 들어볼 수 있다.

 

"현재 인구가 가장 많은 도시에 번호를 매겨서 확인하고 싶어."

SELECT CITY, 
       SUM(PPTI) PPTI,
       CASE WHEN SUM(PPTI) IS NULL THEN 0 ELSE RANK() OVER (ORDER BY NVL(SUM(PPTI),0) DESC) END AS PPTI_RANK
FROM COUNTRY
GROUP BY CITY;

 

인구수 합계에 따른 내림차순으로 순위를 매긴다. 다만, 강북과 잠실과 같은 경우 동일 순위로 '2' 로 표시가 되는데 그 다음으로 오는 성수의 경우 '4' 로 표시된다.


중복이 있더라도 순차적으로 표현하고 싶다면 

RANK_OVER() > DENSE_RANK() 로 바꿔 사용하면 된다.

그럼 위 그림과 같이 성수가 '3' 으로 정상 표기된다.


하지만 중복값 없이 순차적으로 순위를 매기고 싶다면 추가컬럼을 추가하여 표현할 수도 있다.

SELECT CITY, 
       SUM(PPTI) PPTI,
       MAX(AGE) AGE,
       CASE WHEN SUM(PPTI) IS NULL THEN 0 ELSE RANK() OVER (ORDER BY NVL(SUM(PPTI),0) DESC, MAX(AGE) DESC) END AS PPTI_RANK
FROM COUNTRY
GROUP BY CITY;

어떤 차이인 지 보이는가? 예시로 해당 지역의 최고령까지 순위 매김에 참고를 시킨다면 중복 없이 순서를 매길 수 있다.

물론 추가컬럼을 어떤 걸로 사용해야 중복값 없이 뽑아낼 수 있는지는 충분한 분석 후에 진행하는 것이 좋다.

 

추가 문의사항 혹은 해당 과정을 더 쉽게 진행할 수 있는 스크립트가 필요하신 분은 댓글 남겨주시면 자료 제공 및 성실히 도와드리겠습니다.

'SQL의 모든 것 > SQL의 실무' 카테고리의 다른 글

오라클 DISTINCT(중복 제거)  (0) 2024.06.14
오라클 PIVOT 함수  (0) 2024.06.11
오라클 컬럼 순서 바꾸기  (3) 2024.06.08
오라클 DML(INSERT, DELETE, UPDATE)  (3) 2024.06.06
오라클 CREATE TABLE [PARTITION BY]  (5) 2024.06.06