안녕하세요?
오늘은 데이터에 랭킹(RANKING) 을 매기는 SQL문에 대해서 알아보겠습니다.
먼저 UNION ALL을 이용하여 가상의 데이터를 만들어 봅시다.
SELECT 1 B, 0 C FROM DUAL UNION ALL SELECT 5 B, 9 C FROM DUAL UNION ALL SELECT 4 B, 9 C FROM DUAL UNION ALL SELECT 3 B, 7 C FROM DUAL UNION ALL SELECT 2 B, 6 C FROM DUAL UNION ALL SELECT 4 B, 4 C FROM DUAL UNION ALL SELECT 1 B, 5 C FROM DUAL UNION ALL SELECT 2 B, 1 C FROM DUAL |
결과
B C
--------------------------------
1 0 5 9 4 9 3 7 2 6 4 4 1 5 2 1 |
쉽게 결론부터 말하자면
RANK() OVER() 란 특정 컬럼의 값에 순위를 매겨주는 것입니다.
SELECT C, RANK() OVER(ORDER BY C DESC) FROM ( SELECT 1 B, 0 C FROM DUAL UNION ALL SELECT 5 B, 9 C FROM DUAL UNION ALL SELECT 4 B, 9 C FROM DUAL UNION ALL SELECT 3 B, 7 C FROM DUAL UNION ALL SELECT 2 B, 6 C FROM DUAL UNION ALL SELECT 4 B, 4 C FROM DUAL UNION ALL SELECT 1 B, 5 C FROM DUAL UNION ALL SELECT 2 B, 1 C FROM DUAL ) |
C RANK()OVER(ORDERBYCDESC)
---------------------------------------------------------
9 1 9 1 7 3 6 4 5 5 4 6 1 7 0 8 |
결과에 보듯이 C컬럼의 값을 DESC로 ORDER BY 하여 순위를 매겨줍니다.
1등, 3등, 4등, 5등, 6등....
아~! 여기서 보니까 공동 1등이 있으니까 2등은 없고 바로 3등으로 넘어가는군요?
그러면 공동 1등이 있고 3등을 2등으로 만들어줄수는 없을까?
그게 바로 DENSE_RANK() OVER() 입니다.
SELECT C, DENSE_RANK() OVER(ORDER BY C DESC) FROM ( SELECT 1 B, 0 C FROM DUAL UNION ALL SELECT 5 B, 9 C FROM DUAL UNION ALL SELECT 4 B, 9 C FROM DUAL UNION ALL SELECT 3 B, 7 C FROM DUAL UNION ALL SELECT 2 B, 6 C FROM DUAL UNION ALL SELECT 4 B, 4 C FROM DUAL UNION ALL SELECT 1 B, 5 C FROM DUAL UNION ALL SELECT 2 B, 1 C FROM DUAL ) |
C DENSE_RANK()OVER(ORDERBYCDESC)
-------------------------------------------------------------------
9 1 9 1 7 2 6 3 5 4 4 5 1 6 0 7 |
아까 3등 먹었던 놈이 2등이 되었군요. 간단합니다.
RANK() OVER()는 순위를 매겨주되 공동 순위가 있을 경우 그만큼의 수를 넘어서 랭킹이 주어지고
DENSE_RANK() OVER()는 수를 넘지 않고 순서대로 랭킹을 주는 것입니다.
그렇다면 다른 한가지
만약 공동 순위를 주지 않고 같은 값일 지라도 순위를 매겨줄수 있는.. 즉, 공동 1등 두명에게 임의로 넌 1등 넌 2등 이라고
순위를 줘서 중복되는 순위없이 순위를 줄수 있는건 뭐가 있을까요?
그게 바로 ROW_NUMBER() OVER()입니다.
같은 값을 가진 두개의 데이타가 있다고 가정할때 공동 1등을 주는것이 아니라
한놈은 1등하고 한놈은 미안하지만 2등해라 라고 하는겁니다. 결과를 보시면 이해가 빠르실겁니다.
SELECT C, ROW_NUMBER () OVER(ORDER BY C DESC) FROM ( SELECT 1 B, 0 C FROM DUAL UNION ALL SELECT 5 B, 9 C FROM DUAL UNION ALL SELECT 4 B, 9 C FROM DUAL UNION ALL SELECT 3 B, 7 C FROM DUAL UNION ALL SELECT 2 B, 6 C FROM DUAL UNION ALL SELECT 4 B, 4 C FROM DUAL UNION ALL SELECT 1 B, 5 C FROM DUAL UNION ALL SELECT 2 B, 1 C FROM DUAL ) |
C ROW_NUMBER()OVER(ORDERBYCDESC)
------------------------------------------------------------------------------
9 1 9 2 7 3 6 4 5 5 4 6 1 7 0 8 |
내용이 유용하셨다면 가시는길에 댓글한마디 부탁드립니다.
|