Programming/Oracle

[Oracle] 순위 함수

Isaac S. Lee 2023. 9. 4. 16:37

💡순위 함수


순위 함수는 rownum기반으로 만들어진 함수이다.

 

 

[Oracle] 의사 컬럼 (Pseudo Column)

💡의사 컬럼 의사 컬럼(Pseudo Column)은 실제 컬럼이 아닌데 컬럼처럼 행동하는 객체이다. 객체의 종류 SELECT name, buseo,--컬럼(속성) 100,--상수 substr(name, 2),--함수 rownum--의사컬럼 FROM tblInsa; 컬럼(속성

isaac-christian.tistory.com

rownum에 대해서는 위 글을 참고하도록 하자.

 

💡rank() over(order by 컬럼명 [asc|desc])


급여순으로 가져오는 쿼리를 작성해보도록 하자.

 

rownum을 이용하는 방법

--rownum
SELECT name, buseo, basicpay, rownum
FROM (SELECT name, buseo, basicpay FROM tblInsa ORDER BY basicpay DESC);

 

rank() over()를 이용하는 방법

SELECT
	name, buseo, basicpay,
	rank() over(ORDER BY basicpay desc) AS rnum
FROM tblInsa;

rank 괄호 안에는 아무것도 안 넣고, over 괄호 안에 내가 원하는 정렬을 넣으면 된다.

rownum을 이용한 정렬을 함수형으로 작성하는 게 rank() over()을 이용하는 구문이다.

 

rank() over()는 동급일 경우 순위를 같게 하며, 그다음 순위에 영향을 준다.

 

💡dense_rank() over(order by 컬럼명 [asc|desc])


SELECT
	name, buseo, basicpay,
	dense_rank() over(ORDER BY basicpay desc) AS rnum
FROM tblInsa;

dense_rank() over()는 동급인 경우 순위를 같게 하며, 다음 순위에 영향을 주지 않는다.

 

💡row_number() over(order by 컬럼명 [asc|desc])


SELECT
	name, buseo, basicpay,
	row_number() over(ORDER BY basicpay desc) AS rnum
FROM tblInsa;

row_number() over()는 순위에 중복을 허용하지 않는다.

 

급여 8위인 직원

SELECT * FROM (SELECT
					name, buseo, basicpay,
					row_number() over(ORDER BY basicpay desc) AS rnum
				FROM tblInsa)
					WHERE rnum = 8;

select문을 from절에 넣어서 where절로 조건을 비교하여 급여가 8위인 직원을 구할 수 있다.

 

💡partition by


SELECT
	name, buseo, basicpay,
	rank() over(PARTITION BY buseo ORDER BY basicpay DESC) AS rnum
FROM tblInsa;

partition by는 키워드는 다르지만 group by라고 생각하면 된다.
partition by는 순위를 매기고자 그룹을 짓는 것이다.

위 코드에서는 부서를 기준으로 partition을 매겼으므로 부서별로 그룹 되어 순위가 매겨진다.

 

각 부서별 1등

SELECT * FROM (SELECT
					name, buseo, basicpay,
					rank() over(PARTITION BY buseo ORDER BY basicpay desc) AS rnum
				FROM tblInsa)
					WHERE rnum = 1;

partition by를 이용하면 부서별로 급여가 1등인 직원만을 가져올 수 있다.

이처럼 그룹별로 순위를 매겨야 할 때, partition by를 떠올리도록 하자.